OmniAICreator/Qiita-1.07M huggingface dataset:
AppleScriptでプレビュー.appの最前面ウィンドウのファイルをゴミ箱に捨てる。

うちで使っているスキャナーは，スキャンが完了すると，データ（JPEGやPDF）を規定のフォルダに保存した上でプレビュー.appで開きます。
スキャンの設定ミス等でゴミファイルが出来てしまった場合に，さっとゴミ箱に入れられると便利。
AppleScriptで自動化してみましょう。

```applescript
tell application "Preview"
	display dialog (name of document of window 1 & "を捨てますか？") buttons {"キャンセル", "捨てる"} default button 1
	if button returned of result is "キャンセル" then error number -128
	set ThePath to path of document of window 1
	close window 1
end tell
set TheFile to POSIX file ThePath
tell application "Finder"
	delete TheFile
end tell
```
「close window 1」の行を削除すれば，プレビューではファイルを開いたまま，ファイルがゴミ箱に移動します。
誤ってゴミ箱に入れてしまった場合，Finderで【編集 > 取り消す ⌘Z】で取り消せます。

このスクリプトをメニューバー（OSXの画面上端部の帯）から呼び出せると便利。
【スクリプトエディタ.appの環境設定 > 一般 > スクリプトメニュー】から「メニューバーにスクリプトメニューを表示」するように設定し，上記のスクリプトに適当な名前をつけて，スクリプトフォルダ（スクリプトメニューから参照可能）に保存しておけば，メニューバーからこのスクリプトを実行できます。（ファイルフォーマットは「スクリプト」でOK）
（初回実行時は，AppleScriptにPreview.appやFinder.appの操作権限を与えるかどうか確認するダイアログが出ます。）
Enjoy!
【SharePoint】SharePoint のビューでリストIDをゼロパディングして表示する。

> 2021/06/23 モダン表示の場合を追加しました。

# クラシック表示の場合

## [JS リンク]を使用する

ビューでページの編集から、表示を変更したいリストの [Web パーツの編集] で [JS リンク] に js ファイルを指定します。

```js
(function () {
  var ctx = {};
  ctx.Templates = {};
  ctx.Templates.Fields = {
    'ID': {
      'View': function (ctx) {
        var num = ctx.CurrentItem.ID;
        return ('000' + num).slice(-4);
      },
    }
  };

  SPClientTemplates.TemplateManager.RegisterTemplateOverrides(ctx);
})();
```
## [集計値]列を使用する [^1]

[集計値]列を作成して、[数式]を指定します。

```vb:例）
="ID-"&TEXT(ID,"0000")
```

![WS000007+%25282%2529[1].JPG](https://qiita-image-store.s3.amazonaws.com/0/111975/4399503f-c590-e901-9ec6-756da08a789e.jpeg)

[^1]: 列の設定時にはうまくいきますが、アイテムを編集したりすると'“0”になってしまう不具合があるようです。

# モダン表示の場合

## 詳細モードで JSON を指定する

列の書式設定で詳細モードを選択して JSON を入力します。

```json
{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
  "elmType": "div",
  "txtContent": "=padStart([$ID], 6, '0')"
}
```

```json:数値列の場合
{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
  "elmType": "div",
  "txtContent": "=padStart(toString(@currentField), 4, '0')"
}
```

## Power Apps フォームの場合

Text 関数を使います。

```vb:DataCard.Default=$fx$
Text(ThisItem.ID, "000000")
```

# 参考サイト
- [SharePoint 2013 「JS リンク」を試してみた](https://idea.tostring.jp/?p=68)
- [集計フィールドの数式](https://docs.microsoft.com/ja-jp/previous-versions/office/developer/sharepoint-2010/bb862071(v=office.14))
- [ID列を集計列で計算に利用すると 0 が返る問題は SharePoint 2013 でも修正されない](http://sharepointmaniacs.com/archives/4296)
- [列の書式設定で SharePoint をカスタマイズする - 演算子](https://docs.microsoft.com/sharepoint/dev/declarative-customization/column-formatting#operators)
もはやJavaScriptはプログラミング初心者向けではない

#前提
この記事は以下の項目全てに当てはまる方に推奨する言語として、
JavaScriptを推奨してほしくない理由を述べます。

- プログラミング初心者
- 特段目的はないがいずれかのプログラムをちゃんと勉強したい人
- 独学

#JavaScriptが初心者に向かない理由
JavaScriptはWebエンジン上で動作するスクリプト言語です。
C/C++/Javaなどのコンパイル言語ではないため、
初心者には環境構築も容易で、特段HTMLやCSSも簡易なものであれば、
難しいといったことはないから初心者にオススメできる。

確かに数年前はそうでした。
今もそう捉えようと思えばそう捉えられないことはないです。

じゃあなぜ推奨しないか。

初心者がきちんとJavaScriptを勉強しようとするには、
JavaScriptに関する情報量が多すぎるからです。
以下にその事例をあげます。
##jQueryの甘い蜜
一度JavaScriptをきちんと勉強しようとすれば、
十中八九初心者は、技術記事やアドバイスなどで
この単語を見かけると思います。

jQueryはJavaScriptのライブラリで、
主にDOM（Document Object Model）を操作する処理や、
Ajax（非同期なクライアントとサーバとの間の通信）処理を容易に、
ブラウザエンジンごとの仕様を気にかけることなく行うことができます。

jQueryを否定するわけではありませんが、
昨今のWebエンジンはブラウザエンジンごとの仕様が以前より
改善されてきているため、jQueryを用いる場面もかなり減ってきています。

ですがこれらの事実は勉強したからわかる話であって、
JavaScript初学者は、
技術記事でよくみかけるであろう煽り文句とともに、
jQueryの直感的な操作のみに焦点を当ててしまい、
それが便利でとても魅力的なものに見えてしまう。

クライアントサーバモデルやAjaxという
言葉にも触れられる機会は少ないでしょう。

##数々のライブラリやフレームワークの乱立
jQueryの甘い蜜を、
なんとか啓蒙記事を見るなどして乗り越えたら、
次に直面するのがこの問題。

Node.js？　Vue.js？　React.js？　AngularJS？　 ES5？　ES6？
はてなの連続です。

どれが一体JavaScriptと呼ばれるものなのでしょうか。
言語仕様という言葉もわからない初心者にとって
この問題はとても罪深いです。

ES5/ES6にしても、
どれがES5に基づく技術記事で、どれがES6に基づく技術記事なのか。
なかなか初心者には判断が難しい。

最近、私もReact.jsのバージョンによる仕様が変わったことで、
推奨される記述方法がガラッと変わってしまい驚きました。

初心者にとってはもうはちゃめちゃです。
自分なら多分オーバーヒートしますね。

##プログラミング初心者に教えるにあたって
ECMAScriptというJavaScriptの標準規格に、
独学でたどり着いた人が中にはいるかもしれません。
ですがJavaScriptの言語仕様にたどり着くことさえ、
初心者にとっては難しいと容易に想像できます。

また、初心者になんらかのプログラミング言語を勧める場合、
自分が経験した言語で、ある程度の道しるべを示すべきだと思います。

最後に、こういう記事を書いていて、
世に出すのであれば正確な情報、
わかりやすい情報を提供することが重要だと思いました。
Embulkについて

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/6dbd4ed4-5afe-842a-0590-e3a9b79d4500.png)

データ分析基盤入門を読んだまとめ。
個人的に必要そうな部分についてのみ。

Embulkについて。

## 総論
利用方法やどこに特化しているかを理解する

## Embulkとは
バッチ型の並列・分散バルクデータローダー
簡単にいうと大量データを効率良く転送するためのツール
並列処理を有しているだけで並列定義できるわけではない(それはdigdag)

## 登場背景
準リアルタイム収集化によるユースケースの増加

- 影響
  - 抽出バッチ設定ファイル煩雑化による属人化・保守性の低下
  - 定期的な大量読込

## 読出対象例
- CSVファイル
- S3
- MySQL
- PostgreSQL

## できること
- 抽出・加工・出力処理を設定ファイルで組み合わせること
- 組み合わせによる直列・並列度、流量、タイミングの調整(**パイプライン処理**)
- 処理単位制御
- 再継続処理
- エラー・リトライ制御

## 特徴
- プラグイン拡張
- スキーマを用いたデータバリデーション

## 使い所
- 一時的な処理負荷がかかるケース例
  - 日次パーティショニングされたスキーマへの日またぎ出力時
  - ログ増加と集計処理の同時間帯発生時
  - メモリ容量逼迫によるインデックス更新遅延時

## 書籍情報
鈴木 健太, 吉田 健太郎, 大谷 純, 道井 俊介, データ分析基盤構築入門
https://amzn.to/2B6f8G5

## 雑感
文脈の中でややこしい表現がある
読込・読出・書込・書出
ETLのE(抽出)に対して読出・読込
T(変換)には実質加工も含まれるので変換・加工と表記
L(読込)は出力対象に対して「読込ませる」という意味でのL
Lの対象に書出・書込
と解釈
ただ読込は対象や活用形によって対象がどちらにもなるのでこの辺りは表記揺らさない方が良さそう
Go の Revel フレームワークでタイムゾーンを設定する

## 動機

Revel を new して開発を進めていくと、ログに出る時間が local タイムゾーンとズレていることがわかった。

```:sample_request.log
INFO  13:20:49    app server-engine.go:213: Request Stats                            namespace=App\\ duration_seconds=0.0003713 section=requestlog  ip=127.0.0.1 method=GET action=App.Index path=/ start=2018/11/15 13:20:49 status=200
```

脳内変換しても良いのだが、そもそもすべての時間を JST にしたほうが都合が良いこともあったので対応することにした。

## アプリケーション全体のタイムゾーンを変更する

Revel 自体の config には timezone に関するものは無いようなので、go 標準ライブラリの `time` を使って実現する。

Revel では `app/init.go` がアプリケーション全体に対する initializer としての機能を提供しているので、この場でタイムゾーンを指定してやれば良さそう。

```diff:app/init.go
  import(
      "github.com/revel/revel"
+     "time"
  )

  func init() {
      // JST だと UTC との差は +9時間
      // "Asia/Tokyo" はラベルでしかないので、開発者がわかりやすければ何でも良い
+     time.Local = time.FixedZone("Asia/Tokyo", int((9 * time.Hour).Seconds()))

  // ~~ snip ~~

  }
```

[ドキュメントにもあるように](https://golang.org/pkg/time/#Location)、場合によってはすでに定義済みの timezone location があるのであればそれを使ってもよい。

> 	// If the system has a timezone database present, it's possible to load a location
>	// from that, e.g.:
>	//    newYork, err := time.LoadLocation("America/New_York")

そっちがあるならそちらを使う、という実装にするのであれば例えば以下のようになる。

```diff:app/init.go
  import(
      "github.com/revel/revel"
+     "time"
  )

+ const location = "Asia/Tokyo"

  func init() {
+     loc, err := time.LoadLocation(location)
+     if err != nil {
+         loc = time.FixedZone(location, int((9 * time.Hour).Seconds()))
+     }
+     time.Local = loc

      // ~~ snip ~~

  }
```

おしまい。

## ref

https://golang.org/pkg/time/
【UiPath】Invoke Codeの使い方

UiPathのInvoke Codeの使用例です。

今回は、データテーブルをディクショナリに変換する例です。
Invoke Codeのコード編集にて、以下コードを記入します。

```vb
result = False
dict = New Dictionary(Of String, String)

If Tbl.Columns.Count <> 2 Then
  Exit Sub
End If

For Each row As DataRow In Tbl.Rows
 dict.Add(row.Item(0).ToString, row.Item(1).ToString)
Next

result = True
```

引数の設定は以下のとおりです。
ポイントは
**「名前」列に定義された変数をコード内で使い、その変数を「値」列に定義した変数に格納する**
というところです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/ac27a14f-5e0d-7f29-c86a-e686f59796fc.png)

個人的にはBluePrismとは違い、インテリセンスが効くのでコーディングはしやすいです。
欲を言うとコードフォーマット機能も欲しかったですが。。。
sambaの『NT_STATUS_ACCESS_DENIED』で苦しんだ記録(Ubuntu 18.04)

# 前提
私はエンジニアではなく、基本的に趣味でしかLinuxを使っていない万年初心者です。
ふだんはあまり投稿しませんが、10時間近く苦しんで倒れかけたので、同じ苦労をする人を少しでも減らしたいと考え、思い切って共有することにしました。

# やろうとしたこと
Ubuntuで新しくマウントしたハードディスクのルート配下をsambaの共有ドライブにする

# ユーザー名もパスワードも正しいのにアクセスできない！
Windowsから共有ドライブを開くと、パスワード入力画面が出ました。正しいパスワードを入れても開きません。**smb.conf** を何時間もいじり倒したのですが解決せず。

# 原因はフォルダのパーミッション設定にあった
Ubuntuでは、『**ディスク**』でハードディスクをマウントすると、デフォルトで**/media/**配下となります。
ところが、通常**/media/**配下のパーミッションは制限がかかっています。これが原因でした。そこで
>sudo chmod 777 /media/
>sudo chmod 777 /media/user/

を実行したところ

>user@server:/media/user$ pwd
>/media/user

>user@server:/media/user$ ls -al
>drwxrwxrwx+ 4 root   root       4096 11月 15 03:26 .
>drwxrwxrwx  3 root   root       4096 11月 12 11:53 ..
>drwxrwxrwx  4 samba  sambashare 4096 11月 15 12:12 hdd1

となり、Windowsからも無事アクセスできるようになりました。
考えてみれば至って単純な話なのですが、sambaでトラブルがあるとsmb.confに原因を求めがちで、盲点となっていました。
/media/のような浅いフォルダに権限をつけてしまうのは気持ち悪いのですが、とりあえずこれで……。
FreeBSD で NEC PC-98x1 シリーズ標準フロッピーフォーマットの方法

今更💾フロッピーディスクの🍣ネタは🐟新鮮味が無いが、❓忘備録として 💻NEC PC-98x1 シリーズで長きにわたり利用されてきた一般的なフォーマットである 1.25M を FreeBSD 上で扱う事について記述している。
#デバイスが無くなっとるのぉ😄
何時の頃からか分からないが、1.25M メディアへの専用デバイスが😱無くなっていて、執筆時点での最新版である 11.2-RELEASE 上で扱うことが出来ないように見える。

```text
> ls -l /dev/fd0
crw-rw----  1 root  operator  0x61 11月 15 02:15 /dev/fd0
```
旧来は [/dev/fd?.1232](http://www.jp.freebsd.org/QandA/HTML/347.html) とか💾メディアタイプ💿に合わせたデバイスがあった筈。
#ほいじゃ、どげんすっとね？
[fdcontrol(8)](http://www.koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=fdcontrol&dir=jpman-11.2.2%2Fman&sect=0) で物理ドライブを制御してやる事で、1.25M メディアが操作できるようになる。

```text
# fdcontrol -s 8,1024,,,77,500,2 /dev/fd0
# fdformat /dev/fd0
```

フォーマットが出来れば [newfs_msdos(8)](http://www.koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=newfs_msdos&dir=jpman-11.2.2%2Fman&sect=0) するなりなんなりと。
【SharePoint 2013】発行機能を有効にする 


発行機能を有効にする
====================
Web コンテンツ管理機能を使用するには、サイトの発行機能を有効にする必要があります。
サブサイトの発行機能を有効にするには、まずサイトコレクションのトップレベル サイトの発行インフラストラクチャを有効にする必要があります。

サイト コレクション レベルで発行機能を有効にする
--------------------
1. 現在の位置がサイトのルートではない場合は、[サイト コレクションの管理] の [トップレベルのサイト設定に移動] をクリックします。
2. [サイトの設定] ページで、[サイトコレクションの管理] の [サイト コレクションの機能] をクリックします。
3. [サイト コレクションの機能] ページで、[SharePoint Server 発行インフラストラクチャ] の横にある [有効にする] をクリックします。

サイト レベルで発行機能を有効にする
--------------------
1. [サイトの設定] ページの [サイトの操作] で、[サイト機能の管理] をクリックします。
2. [SharePoint Server の発行機能です] の横にある [有効にする] をクリックします。

利用可能になる機能
====================
Web パーツ
--------------------
利用可能になる Web パーツです。

### クエリ結果 Web パーツ
* この Web パーツの [プロパティ] ウィンドウ内で作成したクエリに基づいて、サイト上のコンテンツの動的ビューを表示します。

### メディア Web パーツ
* メディア クリップ (ビデオと音声) を Web ページに埋め込むために使います。

### 概要リンク Web パーツ
* 作成者は、グループ化してスタイルを適用できるリンクを作成できます。

### 目次 Web パーツ
* サイト コレクションに含まれる各要素にリンクされたサイト マップを自動的に生成するために使います。


マスターページ設定
--------------------
マスターページとページレイアウトは、SharePoint サイトの全体的な外観を指定します。マスターページには、複数のページレイアウト (ナビゲーション、検索、多言語サイト用の言語設定など) で共有されるコントロールが存在します。ページレイアウトには、フィールドコントロールと Web パーツが存在します。ページレイアウトとマスターページが連携することで、Web ページのレイアウトを構成しています。
発行サイトでは、マスターページが更新され、[発行] タブが組み込まれています。このタブには、前述のスケジュール設定とワークフローで使うボタンがあります。更新されたマスターページには、以下の要素があります。

### コンテンツ タイプ
* 発行ポータル テンプレートの場合は、[アーティクル ページ]、[プロジェクト ページ]、[ウェルカム ページ]、[エンタープライズ Wiki ページ]、[ロールアップ ページ]、[リダイレクト ページ] があります。

### ページ レイアウト
* [イメージを左に配置]、[イメージを右に配置]、[スプラッシュ]。発行機能が有効になると、これらのページ レイアウトは、前述のコンテンツ タイプに自動的に関連付けられます。エンタープライズ Wiki の場合は、ページ レイアウトに [基本ページ]、[基本プロジェクト ページ]、[リダイレクト ページ] が含まれます。

### 列
* ページ レイアウトの列は [バイライン] と [ページ コンテンツ] です。サイト コレクション レベルで追加されている発行に関する列は、[アーティクルの日付]、[スケジュールの開始日]、[スケジュールの終了日] です。Wiki ページ用の管理されたメタデータを使う [Wiki のカテゴリ] カスタム列も、サイト コレクション レベルで追加されています。

参考サイト
====================
* [発行機能を有効にする](https://support.office.com/ja-jp/article/%E7%99%BA%E8%A1%8C%E6%A9%9F%E8%83%BD%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B-18ee3cfe-7ac1-4b47-93f0-98b5468c50a1?ui=ja-JP&amp;rs=ja-JP&amp;ad=JP)
* [SharePoint Online 発行サイトで有効になる機能](https://support.office.com/ja-jp/article/SharePoint-Online-%E7%99%BA%E8%A1%8C%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%AA%E3%82%8B%E6%A9%9F%E8%83%BD-3ab3810c-3c2c-4361-9d0e-0cbe666ea0b0?ui=ja-JP&amp;rs=ja-JP&amp;ad=JP#__toc336865557)
画像表示を含む自分用アプリの雛形(3) Direct2D化-2, WIC, DirectWriteの利用

Direct2Dで画像表示がきれいになってくると、GDI描画の文字の汚さが目についてきます。
描画位置もピクセル単位なので、文字をアニメーションで動かしてみるとカクカクした動きで残念になりますね＞＜

また、PNG, JPGの画像ファイルへの対応もしたいところです。

ということで、前回からの雛形にてDirectWriteとWICを利用することにします。

参照:)
[画像表示を含む自分用アプリの雛形(1)] (https://qiita.com/tanakah/items/e43c3a34caefc27dddff)
[画像表示を含む自分用アプリの雛形(2)] (https://qiita.com/tanakah/items/7cc26ee9a403cac773a3)

## ヘッダーにincudeファイルの設定追加
```
//// DirectWrite
#include <dwrite.h>
#pragma comment(lib, "dwrite.lib")
//// WIC
#include <wincodec.h>
#pragma comment(lib, "windowscodecs.lib")
```

## グローバル変数の追加

文字を書くためには、ブラシとフォントが必要になります。

```
IWICImagingFactory    *pWIC_Factory;

IDWriteFactory        *pDWR_Factory;
ID2D1SolidColorBrush  *pSCBrush;
IDWriteTextFormat     *pFont;
```

## Initialize()/Uninitialize()に初期化/終了コードを追加

```
  DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), reinterpret_cast<IUnknown **>(&pDWR_Factory));
  CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pWIC_Factory));
...
  pDCRT->CreateSolidColorBrush(D2D1::ColorF(0xff0000, 1.f), &pSCBrush); // ColorF(RGB,A)
  pDWR_Factory->CreateTextFormat(L"Consolas", NULL,
                                 DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL,
                                 10.f*(96.f/72.f), L"en-US", &pFont);
```

```
  pWIC_Factory->Release();
  pDWR_Factory->Release();
```

## WICを使ってPNGファイルをD2DBitmapに変換
```
      IStream *pIStream;
      HRESULT hr=SHCreateStreamOnFile(ffilename, STGM_READ, &pIStream);
      if(hr==S_OK){
        IWICBitmapDecoder *pDecoder=NULL;
        IWICBitmapFrameDecode *pDecodedFrame=NULL;
        
        pWIC_Factory->CreateDecoderFromStream(pIStream, NULL, WICDecodeMetadataCacheOnLoad, &pDecoder);
        pDecoder->GetFrame(0, &pDecodedFrame);

        IWICBitmapSource *pWIC_BS=NULL;
        WICPixelFormatGUID WIC_PixelFormat=GUID_WICPixelFormat32bppPBGRA;
        WICConvertBitmapSource(WIC_PixelFormat, pDecodedFrame, &pWIC_BS);
        
        pDecodedFrame->Release();
        pDecoder->Release();
        pIStream->Release();

        pWIC_BS->GetSize((UINT *)&ImageWidth1, (UINT *)&ImageHeight1);
        pDCRT->CreateBitmapFromWicBitmap(pWIC_BS, &pD2D_Bitmap);
        pWIC_BS->Release();
      }

```

## DirectWriteでテキスト描画
D2DBitmap描画後、DrawTextします。例によってマルチバイト仕様＾＾；

```
  case WM_PAINT:
    {
      if(pD2D_Bitmap!=NULL){
        pDCRT->BeginDraw();
        pDCRT->SetTransform(D2D1::Matrix3x2F::Identity());
        pDCRT->DrawBitmap(pD2D_Bitmap, D2D1::RectF(0.f, 0.f, (float)ImageWidth1, (float)ImageHeight1),
                          1.f, D2D1_BITMAP_INTERPOLATION_MODE_LINEAR);
        wchar_t wbuf[256]; MultiByteToWideChar(CP_ACP, 0, "test", -1, wbuf, 256);
        pDCRT->DrawText(wbuf, wcslen(wbuf), pFont, D2D1::RectF(0, 0, 100, 20), pSCBrush);
        pDCRT->EndDraw();
      }
      HDC hdc=GetDC(hDlgImg);
      BitBlt(hdc, 0, 0, FrameWidth, FrameHeight, hFrameDC, 0, 0, SRCCOPY);
      ReleaseDC(hDlgImg, hdc);
      ValidateRect(hDlgImg, NULL);
   }
   break; 
```
【Unity】GetComponentの使い方

#Componentとは？
**Component**とは一言で言うとそのオブジェクトを構成する部品です。
重力(Rigidbody)という部品、音声(AudioSource)という部品などなど。
これらを追加して組み合わせながらゲームを作っていきます。

↓詳しく知りたい方はこちら。
[UnityComponenの使用](https://docs.unity3d.com/ja/current/Manual/UsingComponents.html)
![Componentブログ用1.png](https://qiita-image-store.s3.amazonaws.com/0/211130/44f78432-dca2-c73a-653e-882bf387e284.png)
オブジェクトをクリックした時に**inspector**に表示されるこいつらが**Component**です。
これらの**Component**の値を調整しながらゲームを開発していきますが、**Script**から**Component**の値を変えたいと思うことがあると思います。
その時に使用するのが**GetComponent**です。

#GetComponentの利用
Scriptから**Component**にアクセスして値を変えたりしたいと思うときが多々ありますがそれを行うのに必要なのが**GetComponet**です。

```C#:ComponentGet
    Rigidbody rigidbody;//Rigidbodyを保存しておく箱

	//そのSceneが呼び出された時一度だけ最初に行われる処理
	void Start ()
	{
		//このScriptが付いてるオブジェクトのRigidbodyComponentを取得し箱に保存
		rigidbody = GetComponent<Rigidbody>();

		//RigidbodyComponentのmassを2に変更！
		rigidbody.mass = 2;

		//こんな感じに書いても動くよ
		GetComponent<Rigidbody>().mass = 2;
	}
```	
このようにコードを書くとこのScriptがついているオブジェクトの**Component**を取得し利用することが可能です。
他にもその**Component**がもつ関数なども呼び出すことができます。
日能研の問題をCで解いてみた(2018/11)

[日能研の広告の問題](https://www.nichinoken.co.jp/shikakumaru/201811_sa)を[pythonで解いてみた記事](https://qiita.com/sora410/items/bd349c48e7920e7f2573)があったので、同じことをC言語で実装してみました。


```c
#include <stdio.h>
#include <math.h>

int trim(int d, int n) {
	int w, k=1, t=0;
	while(d > 0) {
		w = d % 10;
		if(w != n) {
			t += k * w;
			k *= 10;
		}
		d /= 10;
	}
	return t;
}

int ite(int *d)　{
	int r;
	r = *d % 10;
	*d /= 10;
	return r;
}

void output(int val) {
	int i,w;
	w = val;
	for(i=6; i>1; i--) {
		if(w%i != 0)
			break;
		w /= 10;
	}
	if(i <= 1) {
		static int cnt = 1;
		printf("%d\n", val);
	}
}

void permutations(int cl, int k, int val) {
	int t_i, t_cl, t_w;
	if(k-2 <= 0) {
		output(val + cl);
		output(val + (10*(cl%10)) + (cl/10));
		return;
	}
	t_cl = cl;
	while((t_i=ite(&t_cl)) != 0) {
		t_w = t_i * pow(10, k-1);
		permutations(trim(cl,t_i), k-1, val+t_w);
	}
}

int main() {
	permutations(123456, 6, 0);
	return 0;
}
```

permutations()を再帰的に呼ぶことでpythonのitertools.permutations()と同様のことを行い、生成した値をoutput()に渡して条件を満たす時だけ出力しています。
【SharePoint 2013】CSS ファイルをマスター ページに適用する 

※サイトコレクションの SiteAssets フォルダ配下に custom.css ファイルを置いた場合を例に説明します。

---
## 発行機能をアクティブ化していない場合
サイトテンプレートを使用するなどの理由で、発行機能をアクティブ化しない場合は、 マスターページを直接編集します。

```html
<head runat="server">
  <!-- 以下の行を追加 -->
  <SharePoint:CssRegistration Name="<%$SPUrl:~SiteCollection/SiteAssets/custom.css%>" runat="server" />
</head>
```
---
## 発行機能をアクティブ化する場合
発行機能をアクティブ化している場合は、サイトの設定から指定します。

1. [サイトの設定] > [外観] > [マスターページ] > [代替 CSS の URL] の項目を開く。
2. ラジオボタンの [このサイト、およびこのサイトを継承するすべてのサイトで使用される CSS ファイルを指定する] を選択する。
3. 共通の CSS ファイルを指定する。

![Capture0000[1].JPG](https://qiita-image-store.s3.amazonaws.com/0/111975/0d38c17a-bcba-38ba-d0ef-ecfe32a630e2.jpeg)

---
## 参考サイト ##
* [SharePoint テーマ エンジンの使用](http://blogs.technet.com/b/office2010_jp/archive/2010/11/26/sharepoint.aspx)
* [代替 CSS の設定を JavaScript で行う](http://idea.tostring.jp/?p=1818)
* [Use Site Url in SharePoint](http://ethan-deng.blogspot.jp/2013/06/use-site-url-in-sharepoint.html)
* [ADDING CSS AND JAVASCRIPT FILES TO SHAREPOINT 2013 MASTERPAGE](http://yakovenkomax.com/cssregistration-and-scriptlink-done-the-right-way/)
【SharePoint 2013】リストに枠線を表示する

リストの標準のビューでは枠線の表示がないため、表として見づらい。 簡易な対策として、以下のスタイルを当てることで枠線を表示すると見やすくなります。
特定のページだけ反映したい場合は、スクリプトエディタを配置して埋め込む。 
サイトコレクション全体に反映したい場合は、代替 CSS のファイルに書き込みます。

```css
table.ms-listviewtable {
  border-collapse: collapse;
}

td.ms-cellstyle {
  border-color: #999;
}
```
AWS 上の Amazon Linux 2 上に OpenAM と OpenAM Agent を構築してみた

◆◆◆OSSTech Advent Calendar 2018◆◆◆
https://qiita.com/advent-calendar/2018/osstech

タイトルの通り、
AWS 上の Amazon Linux 2 の OS に、
OSSTech 製 OpenAM および OpenAM Web Policy Agent for Apache（以下：OpenAM Agent）を構築したので、
その概要を書き綴ります。
こんな感じで構築ができるんだと、皆様のイメージが少しでも膨らめば幸いです。

# OpenAM とは、OpenAM Agent とは
OpenAM は、認証・認可の機能を備え、様々な認証連携に対応したオープンソースのシングルサインオン製品です。

OpenAM Agent は保護されたWEBリソースへアクセスするユーザーのリクエストを止め、OpenAM による認証・認可が済むまでリソースへのアクセスを拒否する製品となります。

OpenAM と OpenAM Agent をインストールすると何が実現できるのかについては、下記の「動作概要」をご覧いただき、イメージが膨らめば幸いです。

# 動作概要
1. OpenAM Agent 配下の PHP サンプルアプリにアクセスします。
2. PHP サンプルアプリの前段に配置されている OpenAM Agent によって、OpenAM にリダイレクトされます。
3. OpenAM で ID/PW 認証を行います。
4. 認証が成功すると、PHP サンプルアプリが配置されたサーバにリダイレクトされ、アプリコンテンツにアクセス可能になります。

ざっくり言うと、「OpenAM の認証が終わるまでは、PHP サンプルアプリにアクセスできない」という動作を実現します。

補足にはなりますが、
OpenAM ですでに認証が完了している場合は、再アクセス時に再度認証を求められません。
また、OpenAM にてログアウトを行った場合は、再アクセス時に再度認証を求められます。

# 構成概要
AWS 上に、Amazon Linux 2 の EC2 インスタンスを構築します。
1つ目のインスタンスには Apache Tomcat 及び OpenAM をインストールします。
2つ目のインスタンスには Apache HTTP Server をインストールし、httpd 上に OpenAM Agent および PHP のサンプルアプリを配置します。（ここでインストールする Web サーバは nginx 等ではなく、 Apacheを使用する必要があります）
![構成図_v2.png](https://qiita-image-store.s3.amazonaws.com/0/316184/61ef413b-5153-ad95-b430-4fa7a008cd4f.png)


今回は、OpenAM 13 と OpenAM Agent 4 をインストールしました。

# OS の準備（AWS での設定）
・AWS 上に EC2 インスタンス(OS : Amazon Linux 2) * 2 を作成します。


# OpenAM および OpenAM Agent のインストール
OSSTech 製品インストールガイドに沿って、前提 rpm パッケージおよび製品 rpm パッケージをインストールします。
製品については、OSSTech で検証版の提供を行っております。

# アプリの配置(今回は PHP としました)
アクセス確認用に作成した、下記の内容の PHP ファイルを、Apache httpd の公開ディレクトリ上に配置します。

```
<?php phpinfo(); ?>
```

#初期設定
OpenAM にて Agentの設定を行います。
参考までに、下記は Agent の初期設定画面となります。
<img width="640" alt="Agent設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/316184/fd26d30b-7d46-c083-55b9-01ac1b5d7ed0.png">

なお、今回は簡単のため、SSO のみモードを ON にしました。(ポリシーを使用しない設定)
![OpenAM003.png](https://qiita-image-store.s3.amazonaws.com/0/316184/114d1e2e-5d62-43a3-7157-f80578759a79.png)


OpenAM Agent の初期設定のスクリプトを実行します。

```
/opt/osstech/share/openam-agent-apache24/bin/agentadmin --i
```
下記の情報を求められるので入力します。

```
   OpenAM URL: (OpenAM の URL を入力)
   Agent URL: (OpenAM Agent サーバの URL を入力)
   Agent Profile name: （OpenAMで指定した Agent 名を指定：今回はAmazonLinux2Agent）
   Agent realm/organization name: (OpenAM でAgentを設定したレルム名を指定：今回は/)
   Agent Profile password source: (パスワードが記載されたファイルを指定)
```

「Installation complete.」と表示されれば、インストールは完了です。

# 動作確認
1. OpenAM Agent 配下の PHP サンプルアプリにアクセスします。
2. PHP サンプルアプリよりも先に動作する OpenAM Agent によって、OpenAM にリダイレクトされます。
3. OpenAM で ID/PW 認証を行います。
<img width="960" alt="OpenAM認証画面.png" src="https://qiita-image-store.s3.amazonaws.com/0/316184/1365a880-464c-6845-f5ab-80e46bbb63c8.png">
4. 認証が成功すると、PHP サンプルアプリが配置されたサーバにリダイレクトされ、アプリコンテンツにアクセス可能になります。
<img width="960" alt="php画面.png" src="https://qiita-image-store.s3.amazonaws.com/0/316184/38b06e72-0fea-4c38-14d8-ad745d4fe405.png">


# まとめ
今回は AWS 上の Amazon Linux 2 に OpenAM および OpenAM Agent を構築して、簡単に動作確認を行ってみました。
基本的には RHEL 上に構築することが多いのですが、 Amazon Linux 2 上でも構築できることで、さらに利用の幅が広がるのではないかと思います。
OpenAM や OpenAM Agent にはさらにいろいろな機能があります。今回使用していない機能についても、今後 Amazon Linux 2 上で動作を確認していければと考えております。
codeigniterのエスケープ

# codeigniterのform_helperとset_value()

codeigniterのviewページを作っていた時にset_value()の挙動が気になったのでメモ

## set_value()
いい感じにPOSTパラメータを保持してフォームやテキストエリアの値をセットできます

```
function set_value($field, $default = '', $html_escape = TRUE)
	{
		$CI =& get_instance();

		$value = (isset($CI->form_validation) && is_object($CI->form_validation) && $CI->form_validation->has_rule($field))
			? $CI->form_validation->set_value($field, $default)
			: $CI->input->post($field, FALSE);

		isset($value) OR $value = $default;
		return ($html_escape) ? html_escape($value) : $value;
	}
```

ここでform_input()などのform_helperと組み合わせて使おうとするとform_helperはデフォルトでエスケープしてくれますので二重にエスケープされます。

ざっくり

```
$h0 = "<script>alert('1');</script>";
$h1 = html_escape($h0);
$h2 = html_escape($h1);
var_dump($h0, $h1, $h2);

// string(28) "(html要素)" string(50) "<script>alert('1');</script>" string(74) "&lt;script&gt;alert(&#039;1&#039;);&lt;/script&gt;"
```

こんな具合です。
二重にエスケープされるのを防ぐにはset_valueの第３引数をfalseにすれば行けます。


自己解決したら、[日本語ドキュメント](http://codeigniter.jp/user_guide/3/helpers/form_helper.html#set_value)に書いてありましたw
Ansibleでファイルの一部をコメントアウトする

```lineinfile``` の ```backrefs``` を使うのだがあまり記事がなかったので。

## やりたいこと

```:/etc/sudoers
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
```

この「root」行をその後のパラメータも保持しつつコメントアウトしたい

```:/etc/sudoers
## Allow root to run any commands anywhere
#root    ALL=(ALL)       ALL  ← スペースの数とか保持してコメントアウト
```

## 確認環境

```bash
# ansible --version
ansible 2.6.4
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]

# cat /etc/redhat-release
CentOS release 6.10 (Final)
```

## NGパターン

### 1. まるっとベタ定義

```yaml:playbook.yml
---
- hosts: "web"
  tasks
    - name: "test"
      lineinfile:
        path: "/etc/sudoers"
        state: "present"
        regexp: "^root "
        line: "#root    ALL=(ALL)       ALL"
```

できるっちゃあ出来るんだけど、スペースの数とかベタ書き。
ちょっとモヤモヤする。

### 2. 変える部分だけ定義すりゃいいんじゃね


```yaml:playbook.yml
---
- hosts: "web"
  tasks
    - name: "test"
      lineinfile:
        path: "/etc/sudoers"
        state: "present"
        regexp: "^root "
        line: "#root"
```

残念ながら「 ```lineinfile``` 」の名前のとおり、1行まるっと書換なのでNG.

```:/etc/sudoers
## Allow root to run any commands anywhere
#root   ← 後ろのパラメータ全部消えた
```

## 結論

perlの正規表現的に言えばこうしたい

```perl
$line =~ s/^(root.*)$/#$1/;
```

このグルーピング(丸かっこで囲って$1で参照)をしたい。
答えは ```lineinfile``` に ```backrefs: "yes"``` を付ける。

```yaml:playbook.yml
---
- hosts: "web"
  tasks
    - name: "test"
      lineinfile:
        path: "/etc/sudoers"
        state: "present"
        backrefs: "yes"
        regexp: '^(root.*)$'
        line: '#\1'
```

```backrefs``` をつけることで後から ```\1``` などで参照できる。

ありがちなミスだと ```YAML``` では ```\``` をスケープしないといけない。
上記では値をダブルクォート ``` "" ``` ではなく、シングル ```''``` を使うことで対応している。

## エビデンス

```
# grep -A 2 ^'## Allow root to' /etc/sudoers
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

# cat test.yml
---
- hosts: "web"
  tasks:

    - name: "test"
      lineinfile:
        path: "/etc/sudoers"
        state: "present"
        backrefs: "yes"
        regexp: '^(root.*)$'
        line: '#\1'

# ansible-playbook -i hosts -l web test.yml

PLAY [web] *********************************************

TASK [Gathering Facts] *********************************
ok: [192.168.200.230]

TASK [test] ********************************************
changed: [192.168.200.230]

PLAY RECAP *********************************************
192.168.200.230            : ok=2    changed=1    unreachable=0    failed=0

# grep -A 2 ^'## Allow root to' /etc/sudoers
## Allow root to run any commands anywhere
#root   ALL=(ALL)       ALL
```

:-)
JDK 11をmacに快適な形で入れる方法

> 追記 2018-10-16
書いた早々ですが、この記事いらなくなりそうです。[先日発表されたAmazon Corretto](https://aws.amazon.com/jp/blogs/opensource/amazon-corretto-no-cost-distribution-openjdk-long-term-support/)が出たら！
現在プレビュー版が提供されているCorretto ８のダウンロードページを見ると、mac版がpkgファイルで提供されています！ これは Corretta 11でもpkgの可能性大！インストーラがいろいろやってくれて最初から快適な可能性大！ かもかもです。Corretto 11の提供は来年の４月まで十分なテストを行ってからとのことですので、それまで待てない人は試してください。

# 対象読者
- 古くはApple続いてOracleのJDKを使ってきた方
- jshellとか面倒なパス設定せずに使いたい方

# 快適ってのは
- JDKのツール群にパスが通ってる幸せ。

# 快適にする手順
OracleJDK 11のdmgパッケージで一旦インストールし、アンインストール後 OpenJDK 11を入れるだけ[^1]。
今後12以降でツール類が増えるなら上がったバージョンで同じ手順を行うと良さげ。

## 1. dmg版のOracleJDKをダウンロードしてインストール
- [Java SE Development Kit 11 Downloads](https://www.google.com/search?q=site:www.oracle.com+Java+SE+Development+Kit+11+Downloads&num=1)から、mac用で拡張子が.dmgのJDKをダウンロードする。
- dmgファイルをマウントして中にあるpkgファイルを実行してインストーラ画面で次へ次へ完了。

## 2. すぐにアンインストール
[ここ](https://www.java.com/en/download/help/mac_uninstall_java.xml)にあるとおりのことを実施する
### 2.1.以下をターミナルから実行
```bash

sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin 
sudo rm -fr /Library/PreferencePanes/JavaControlPanel.prefPane 
sudo rm -fr ~/Library/Application\ Support/Oracle/Java
```

### 2.2. JDKを削除[^2]
```bash
sudo rm -rf /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk
```


## 3. OpenJDKをインストール 
- おすすめの多い[AdoptOpenJDK](https://adoptopenjdk.net/)からOpenJDK 11をダウンロード。HotspotかOpenJ9の選択は好みで[^3]。
- Finderからダブルクリックで展開
- ターミナルで、展開してできたフォルダ[^2]をOracleJDKがあった場所に移動

```bash
sudo mv ~/Downloads/jdk-11.0.1+13 /Library/Java/JavaVirtualMachines/
```

- .bashrcとか.zshrcとかには、複数JDKがある場合java_homeは最新を返してくれるので以下のように修正。

```bash
export JAVA_HOME=$(/usr/libexec/java_home)
```

最初にいれたOracleJDKのpkgインストーラが/usr/bin/jshellなどのリンクを作ってくれるようなので、単純にOpenJDK入れるより良さげですよー。

ちなみにデスクトップの方はターミナルの設定にかかわらず自動的に最新のJDKが選ばれるようです。
ちょっと気になったのは、OracleJavaだとeclipse-201809入れたらInstalled JREに/Library/Java/JavaVirtualMachines/にある全バージョンが表示されていたんですが、OpenJDKに変えたらなぜか、jdk-9だけしか表示されなくなっちゃって手動で他を入れるしかありませんでした。
~/Library/Application\ Support/Oracle/Java 辺りに何か仕掛けがあったのかなーー。もう消したし知らんけど。

[^1]: 本音を言えば **「OracleJDK並みに自動設定してくれるOpenJDKのパッケージインストーラ用意してくれよーっ」** ってことだけど…
[^2]: バージョンが上がっていたら適宜読み替えて実施してください。
[^3]: OracleJDKとの乖離が少ないかなーと想像してHotspotを選択したけど、eclipse使うとかならOpenJ9の方がいいかも。知らんけど。
パーティクルをGUIで編集するEgret Featherを使ってみた

サンプルゲームを作っていましたが、バスケットボールがバスケットに入った時の演出をつけようとドキュメントを調べていたら「パーティクル」というものがあることがわかりました。

ところが、APIDOCをみても使いか方がわからない＆サンプル見ても意図通りの演出をするにはハードルが高いなと感じていました。

ところが過去のEgretEngine技術ブログを見ていると、なんとパーティクルエディターがあることがわかりました。

[Egretパーティクルエディタを使用して煙の効果を得る方法](https://mp.weixin.qq.com/s?__biz=MzA4Mzk1ODYzMw==&mid=2653276400&idx=1&sn=87c92e05badbc076b00ae67157115545&chksm=843fe6f6b3486fe0f0b7dbe3b42a3b972b88dc2e93f0d5a1535624583b7e9b03e967341b47f2&scene=21#wechat_redirect)

# インストール
Egret LauncherのToolsタブを確認して、Egret Featherが未インストールならインストールしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/c78262e9-d706-61db-b5ac-ceee789ea742.png)

# デモの確認
メニューのFileからTemplateを選択すると、隕石と雪の二つのパーティクルのテンプレートを読み込むことができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/10c253d3-d449-0e84-b23e-38c049083c92.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/0673fed5-dd1e-feb2-072d-6be801e8584a.png)

# いろいろいじる
ひとまずよくわからないので、GUI上のいろんなパラメータをよくわからずいじりまくります。

テクスチャーを設定して適当にいじったらいい感じになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/c74b8ff9-5b6f-a85a-608d-923c49d46919.png)

# パーティクルのエクスポート
FileメニューからExportすると、パーティクルの設定ファイルがJSON形式で出力されます。

# 組み込み

アプリのプロジェクトのresource/assetsフォルダに、テクスチャーとパーティクルの設定ファイルをコピーしてください。
Egret Wingを開くと自動的にリソースが読み込まれてdefault.res.jsonに追記されるはずです。

# ソースコード

こんな風にするとパーティクルが表示されます

ParticleSystem#startメソッドの引数はパーティクルをエミットする時間(ミリ秒）のようです。

`ts
		const texture = RES.getRes("particle_png");
		const config = RES.getRes("particle_json");
		const particle = new particle.GravityParticleSystem(texture,config);
		particle.emitterX = this.egretX;
		particle.emitterY = this.egretY;
		parent.addChild(particle);
		particle.start(500);
`
ESP32(Nefry BT)からDiscrodのWebhookに通知するメモ


最近Discrodを使ってみてちょっと試してみてます。

![](https://i.gyazo.com/2047e2d2299d2506d6d1c4d8d5feeda2.png)

Nefry BTで試してますが、ESP32でコンパイルは通ったのでWiFi設定とかだけ書いてあげれば他のESP32デバイスでも使えると思います。

```discord.ino
#include <WiFiClientSecure.h>
WiFiClientSecure client;

const int HTTPS_PORT = 443;

void discordPost(String message);

void setup() {
  Serial.begin(115200);
  Serial.println("init..");
  discordPost("こんにちは"); //一回だけPOSTする
}

void loop() {}

//DiscrodにPOSTする関数
void discordPost(String message){
  const char* HOST = "discordapp.com";
  String url = "/api/webhooks/xxxxxx"; //DiscordのWebhookのpath
  String content = "{\"content\": \""+ message +"\"}";
  Serial.print("connecting to ");
  Serial.println(HOST);

  if (!client.connect(HOST, HTTPS_PORT)) {
    Serial.println("connection failed");
    return;
  }

  client.println("POST " + url + " HTTP/1.1");
  client.println("Content-Length: " + String(content.length()));
  client.println("Content-Type: application/json");
  client.println("Host: " + String(HOST));
  client.println("Accept: */*");
  client.println("Connection: close");
  client.println();
  client.println(content);

  unsigned long timeout = millis();
  while (client.available() == 0) {    
    if (millis() - timeout > 5000) {
        Serial.println(">>> Client Timeout !");
        client.stop();
        return;
    }
  }

  // Read all the lines of the reply from server and print them to Serial
  while(client.available()) {
      String line = client.readStringUntil('\r');
      Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection"); 
}
```

## はまったところ

`Content-Length`をしっかり入れてあげないと動いてくれませんでした。
HipChatに送るときはそのままで問題なかったので、サーバー側でよしなにやってくれてたみたい。

あと、`Content-Type: application/json`のヘッダー指定も忘れずに
ダウンロード

[download [ver1] | CreateJS](http://labo.project-nya.jp/createjs/download/ver1/)

aタグでファイルをダウンロードさせるよ。リンクをクリックしてね。

```html
<a id="download" href="../file/piyo.png" download="ひよこちゃん"></a>
```

[download [ver2] | CreateJS](http://labo.project-nya.jp/createjs/download/ver2/)

CreateJS 上のボタンからファイルをダウンロードさせるよ。ひよこちゃんをクリックしてね。
（aタグは見えなくしてあるだけ）

```js
piyo.addEventListener("click", download);

function download(event) {
	document.getElementById("download").click();
}
```
python n次元リストを1次元にする関数

```python
def flatten(lstnd):
    tmp = []
    def flattenlst(lst):
        for i in lst:
            if isinstance(i,list) or isinstance(i,set) or isinstance(i,tuple):
                flattenlst(i)
            else:
                tmp.append(i)
    flattenlst(lstnd)
    return tmp
```
再帰で深く入って行ってまっ平らにする。
内包表記でも書けるけど、こっちのほうが早いんじゃないかと思う。

```python
a = [
 [[['衣服']], 'サイズ', [['XS']], None],
 [[['衣服']], 'サイズ', [['S']], None],
 [[['衣服']], 'サイズ', [['M']], None],
 [[['衣服']], 'サイズ', [['L']], None],
 [[['衣服']], 'サイズ', [['XL']], None]]
print(flatten(a))
>>>['衣服', 'サイズ', 'XXXS', None, '衣服', 'サイズ', 'XXS', None, '衣服',
 'サイズ', 'XS', None, '衣服', 'サイズ', 'S', None, '衣服', 'サイズ', 'M',
 None, '衣服', 'サイズ', 'L', None, '衣服', 'サイズ', 'LL', None, '衣服',
 'サイズ', 'XL', None, '衣服', 'サイズ', 'XXL', None, '衣服', 'サイズ',
 'XXXL', None, '衣服', 'サイズ', 'XXXXL', None]

```
Time Machineのバックアップ対象からnode_modules等の開発依存コードを除外する

yarnでアップデートするたびに、Time Machineが張り切ってバックアップしちゃって困ってたんだけど、
これ使えば手軽に抑制できそうだ。

stevegrunwell/asimov: Automatically exclude development dependencies from Apple Time Machine backups - https://github.com/stevegrunwell/asimov

# インストール

```
git clone git@github.com:stevegrunwell/asimov.git
cd asimov.git
./install.sh
```

## 実行結果

```
./install.sh
Symlinking /Users/hoge/src/github.com/stevegrunwell/asimov to /usr/local/bin/asimov

Asimov daemon has been loaded!

Finding dependency directories with corresponding definition files...

(省略)

- /Users/hoge/src/github.com/MyApp/***/node_modules is already excluded, skipping.
- /Users/hoge/src/github.com/MyApp/***/node_modules has been excluded from Time Machine backups (773M).
- /Users/hoge/src/github.com/MyApp/***/node_modules is already excluded, skipping.
- /Users/hoge/src/github.com/MyApp/***/vendor has been excluded from Time Machine backups (8.0K).
- /Users/hoge/src/github.com/MyApp/***/.vagrant has been excluded from Time Machine backups ( 32K).
```
世紀末秋葉原日記　Ver. 0.2 DOOM

煮詰まった俺は、毎週のように秋葉の店に通い始めた。
同じような連中が集まって、まだ立ち上がったばかりの店に我が物顔で居座り、お手伝いでボードのチェックとかをしたり、junet当たりから仕入れた情報とかを持ち寄って新しい何かを語ったりしていた。
正直迷惑な奴らだが、まだそれを受け入れてもいいような時代だった。

正月明け、俺たちはいつものように秋葉原に集まる。
オヤジは樽酒で迎えてくれた。
ただ、問題はオヤジ自体は酒は飲まないということだ。
減ってきた樽酒に、「これはいい酒だから混ぜてもOK」とどんどんと別の銘柄の瓶から酒を足していった。
そして俺たちも、なんとなくノリでそれを飲みまくった結果が、意識不明である。
完全に正気を失った俺が何をしたかわからないまま、正気を戻したときはもう後の祭り。

「来週どんな顔してあそこにいこう」
というか、秋葉の知り合いにどんな迷惑をかけたかわからない。

とりあえず、comp.binariesに流れていたdoomのお試し版をFDに入れて、次の週に秋葉原にてそれをお土産にお詫び回りをした。結果、そこまでは別に大したこともなかったわけだが。

ただ、そのあとがまずかった。

次の週に秋葉にいくと、某スパンキーで
「お前、何てことしたんだ」
と言われる。
いや、先々週にしこたま酔ってトイレで起き上がったらしいんで、みんなに迷惑かけたよな、といろんな店にdoomの体験版FD配って回っただけですが、何か？

「もうな、どの店もdoom禁止令が出て、すでに首寸前の奴がいるぞ」

いやなに、それわかんない。俺はちょっといけてるゲームのお試し版を配っただけだ。

「誰も仕事しないで、デモのPCでdoomやってんだよ。オーナーとか怒っちゃって大変なんだが」

いや、それ知らないって。

doomごときで秋葉でさえこうなる、そんな時代だった、

と言うことにしておこう。

--
ということで自己紹介兼ねた投稿終了。
続きは誰かが許してくれたら。
[メモ] TinkerBoard で Docker (2018年11月号)

# 概要
- TinkerBoardで、最近のdockerが動かない...
- overlayfsモジュールが必要になった模様. => [ビルドしました](https://github.com/mt08xx/files/raw/master/TinkerOS-v2.0.7_4.4.103%2B_overlayfs_module-20181114-1.tbz)。

    ```shell-session
linaro@tinkerboard:~$ tar tvf ./TinkerOS-v2.0.7_4.4.103+_overlayfs_module-20181114-1.tbz 
-rw-r--r-- root/root    626472 2018-11-14 14:20 lib/modules/4.4.103+/kernel/fs/overlayfs/overlay.ko
linaro@tinkerboard:~$ 
```
- ついでに、[docker-compose](https://github.com/mt08xx/files/raw/master/docker-compose-Linux-armv7l-v1.23.1)も。 <br>※RaspberryPi2/3の環境でも動くはず。(3Bでは確認済み)

- 以前の記事: [[メモ] Docker on ASUS Tinker Board](https://qiita.com/mt08/items/d15eeea2dba446fc7661)<br>(TinkerOS v2.0.3, docker 17.10.0-ce)



# 環境
- ASUS TinkerBoard 
- TinkerOS v2.0.7: <br>`20180622-tinker-board-linaro-stretch-alip-v2.0.7.img.zip`
- Kernel version:<br>`Linux tinkerboard 4.4.103+ #1 SMP Fri Jun 22 16:14:49 CST 2018 armv7l GNU/Linux`
- docker:<br>`Docker version 18.09.0, build 4d60db4`
- docker-compose:<br>`docker-compose version 1.23.1, build 3727fd3f`





# 手順
1. TinkerOS 2.0.7をmicroSDを焼いて、起動して、適当に初期設定を済ませる。いつも通りに。
(2018.11.14現在、chromiumを70とかにアップデートしてしまうと、クラッシュする。)

2. ビルド済み `overlay.ko`を導入

    ```bash
wget https://github.com/mt08xx/files/raw/master/TinkerOS-v2.0.7_4.4.103%2B_overlayfs_module-20181114-1.tbz
sudo tar xvf ./TinkerOS-v2.0.7_4.4.103+_overlayfs_module-20181114-1.tbz -C /
sudo depmod -a
sudo modprobe overlay
lsmod # 確認
```

3. dockerインストール

    ```bash:
curl -sSL https://get.docker.com/ | sh
sudo usermod -aG docker ${USER}
```

4. docker-compose

    ```bash:
DOCKER_COMPOSE_VERSION=1.23.1
sudo mkdir -p /usr/local/bin/
sudo curl -sSL https://github.com/mt08xx/files/raw/master/docker-compose-Linux-armv7l-v${DOCKER_COMPOSE_VERSION} -o /usr/local/bin/docker-compose && sudo chmod +x /usr/local/bin/docker-compose
sudo curl -sL https://raw.githubusercontent.com/docker/compose/${DOCKER_COMPOSE_VERSION}/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
docker-compose --version
```

5. 再起動 (`sudo reboot`)

6. `docker run -it --rm hello-world`


# その他
1. Tinker Board Forumより [Chromium browser crash on startup](https://tinkerboarding.co.uk/forum/thread-1735-page-2.html)

    ```bash
wget https://snapshot.debian.org/archive/debian-security/20180701T015633Z/pool/updates/main/c/chromium-browser/chromium_67.0.3396.87-1~deb9u1_armhf.deb
sudo dpkg -i chromium_67.0.3396.87-1~deb9u1_armhf.deb
sudo apt-mark hold chromium
```
scaleX,scaleYに対する処理

#scaleX,scaleY

enchant.jsでは画像の大きさをＸ軸、Ｙ軸に倍率をかけることができる。

しかしながら1.5倍などと定数で指定してしまうと、画面サイズに応じて大きさが異なってしまう。

だが、https://qiita.com/takoyaki_vs_okonomiyaki/items/716871bc08e7e1290f7f
でも書いた通りwindow.innerWidth/4などで指定すれば画面サイズに対応できる。

例
変数名.scaleX = window.innerWidth / 400;
変数名.scaleX = window.innerHeight / 400;

しかし、これが難しく画面の縦横比に合わせた画像でないとこの方法では思い通りに動かない。

その場合どうするかというのは各画面サイズに合わせた画像を用意するしかないと思う。

一括サイズ変換などのツールが調べたらあるので使ってみてください。
windowが表示されない(Tkinter)

#背景
webアプリケーション開発のためpythonのGUIフレームワークであるTkinterを触ろうとしたところwindowが表示されませんでした。

##解決策
Tkinterのmainloopと言うメソッドで解決しました！！

```python:window_tkinter.py
import tkinter as tk

root = tk.Tk()
root.title(u"test")
root.geometry("400x300")
root.mainloop()
```

![スクリーンショット 2018-11-15 11.33.58.png](https://qiita-image-store.s3.amazonaws.com/0/284340/2e2195c8-6493-9e17-0cd5-da2143fffe60.png)

無事にwindowが表示されました！！
ヒアドキュメントとは・基本の使い方(ruby)

#ヒアドキュメントとは

ヒアドキュメントとは一言で言うと、
『文字列をシェルスクリプトやプログラミング言語に埋め込むための方法』

改行や空白などが書いた通りに適用されるため、複数行に渡る長い文字列を作成する場合に
スッキリ書くことができる。

# どんな時に使うのか
・シェルスクリプトに別のスクリプトを埋め込む
・プロトタイプ時のモックデータとして
etc

#使い方
###基本
```
data =  <<EOS
test
テスト
123
EOS
```
識別子は慣習的にEOFやEOSが使われるが、終わりと始まりで一致していれば何を使用しても良い。

###インデント
```
  data =  <<EOF
  test
  テスト
  123
  EOF

=> SyntaxError: can't find string "EOF" anywhere before EOF
```
dataの前にインデントをつけると
エラーになる

インデントを付けたい場合は
識別子の前に「-」をつける。

```
  data =  <<-EOF
  test
  テスト
  123
  EOF
```
またドキュメント内にインデントをつけると空白と認識されてしまう。
先頭のインデントを無視させるには、識別子の前に「~」をつける

```
data =  <<EOF
  test
  テスト
  123
EOF
=> "  test\n  テスト\n  123\n"

data =  <<~EOF
  test
  テスト
  123
EOF
=> "test\nテスト\n123\n"
```

###式展開

式展開も可能。

```
name = "TAKE"
country = "日本"
data =  <<EOF
私の名前は#{name}です
#{country}から来ました。
EOF
=> "私の名前はTAKEです\n日本から来ました。\n"
```

識別子をシングルクオーテーションで囲むと式展開は無効になる
(文字列として認識される)

```
name = "TAKE"
country = "日本"
data =  <<'EOF'
私の名前は#{name}です
#{country}から来ました。
EOF
=> "私の名前は\#{name}です\n\#{country}から来ました。\n"
```

###その他

ヒアドキュメント内の文字列に対してメソッドを実行できる

```
data =  <<EOF.upcase
test
ruby
EOF
=> "TEST\nRUBY\n"
```

複数のヒアドキュメントを組み合わせることもできる

```
data =  <<EOF1, <<EOF2
ヒアドキュメント１
EOF1
ヒアドキュメント２
EOF2
=> ["ヒアドキュメント１\n", "ヒアドキュメント２\n"]
```

#参考
https://www.sejuku.net/blog/14283#i-10
https://tomoyuki65.com/how-to-use-heredoc-in-ruby/
Queueableインターフェースを実装したクラスでCalloutを呼ぶ

# TL;DR

[ここ](https://developer.salesforce.com/forums/?id=906F0000000Ao4nIAC)に書いてありました。

# Queueableを採用した理由

とある事情で`@future`メソッドから`@future`メソッドが呼ばれてしまうことがあり、`Future method cannnot be called from a future or batch method`の制限に引っかかってしまったためです。

# 最初の実装

シンプルにこんな具合で実装しました。

```java
public with sharing class MyQueueableClass implements Queueable {
  public void execute(QueueableContext context) {
    Http httpClient = new Http();

    HttpRequest request = new HttpRequest();
    request.setEndpoint('http://example.com');
    request.setMethod('GET');
    HttpResponse response = httpClient.send(request);

    MyCustomObject__c record = new MyCustomObject__c(
      ResponseBody__c = response.getBody()
    );
    insert record;
  }
}
```

しかし実行すると、`Callout not allowed from this future method. Please enable callout by annotating the future method. eg: @Future(callout=true)`というメッセージが…。

# 解決法

最初にご紹介した記事の返信の通り、`Database.AllowsCallouts`を`implements`します。

```java
public with sharing class MyQueueableClass implements Queueable, Database.AllowsCallouts {
  public void execute(QueueableContext context) {
    Http httpClient = new Http();

    HttpRequest request = new HttpRequest();
    request.setEndpoint('http://example.com');
    request.setMethod('GET');
    HttpResponse response = httpClient.send(request);

    MyCustomObject__c record = new MyCustomObject__c(
      ResponseBody__c = response.getBody()
    );
    insert record;
  }
}
```

# さいごに

Salesforceには知らない仕様や機能がまだまだたくさんあるなぁ、と再確認させられました。
あとDeveloper Communityはとても有用ですね。
Codecovで特定ブランチのチェックなどを無効にする

# やりたかったこと

master branchとrelease branchが別になるようなブランチ戦略をとっているときに、feature branchからmasterへのmerge後はcode変更がないのでなんらかの理由でCI checkがfailしないようにしたい

# やりかた

サポートに問い合わせたら `!` をブランチ名の先頭に付けると当該ブランチでのcheckなどが無効になるとのこと

```yaml:.codecov.yaml
comment:
  branches:
    - "!master"
coverage:
  status:
    patch:
      default:
        branches:
          - "!master"
    project:
      default:
        branches:
          - "!master"
```

botやCIでのカバレッジの変化の通知やチェックを無効にしたいときのやり方のドキュメント
`*` で任意のブランチって書き方もできるらしい (未検証)

https://docs.codecov.io/docs/pull-request-comments
https://docs.codecov.io/docs/commit-status

Codecovサポートには、CircleCIのブランチ指定方法と同じに書けると良いのではと伝えておいた
https://circleci.com/docs/2.0/configuration-reference/#branches
[illustrator_script]複数オブジェクト選択時のバウンディングボックスサイズの取得方法

## やりたいこと
複数オブジェクト選択時のバウンディングボックスのサイズを取得する。
よく使うのでメモ書きとして。

## やったこと
以下実際のコードです。
本コードは取得したバウンディンングボックスのサイズでガイドを作成する仕様になっています。

```javascript:getBounds.jsx
var doc = app.activeDocument;
var sels = doc.selection;

function getBoundsRect(target) {
    var rect = null;
    function updateRect(targetRect) {
        if (rect === null) {
            rect = targetRect;
            return;
        }
        if (rect[0] > targetRect[0]) {
            rect[0] = targetRect[0];
        }
        if (rect[1] < targetRect[1]) {
            rect[1] = targetRect[1];
        }
        if (rect[2] < targetRect[2]) {
            rect[2] = targetRect[2];
        }
        if (rect[3] > targetRect[3]) {
            rect[3] = targetRect[3];
        }
    }
    for (var i = 0, max = target.length; i < max; i++){
        updateRect(target[i].visibleBounds);
    }
    return rect;
}

// get size of selected obj's bounding box
var boundsRect = getBoundsRect(sels);

// create guide with size of bounding box
var rectObj = doc.pathItems.rectangle(
                      boundsRect[1],
                      boundsRect[0],
                      boundsRect[2] - boundsRect[0],
                      boundsRect[1] - boundsRect[3]
                      );                  
rectObj.guides = true;
```

## 解説

```javascript
for (var i = 0, max = target.length; i < max; i++){
    updateRect(target[i].visibleBounds);
}
```

`visibleBounds`プロパティは配列形式でオブジェクトのバウンディングボックスの座標を返します。
配列の中身は`[左上X座標, 左上Y座標, 右下X座標, 右下Y座標,]`となっています。

```javascript
if (rect === null) {
    rect = targetRect;
    return;
}
```
１回目の処理は取得したvisibleBoundsをそのまま配列`rect`に代入します。

```javascript
if (rect[0] > targetRect[0]) {
    rect[0] = targetRect[0];
}
if (rect[1] < targetRect[1]) {
    rect[1] = targetRect[1];
}
if (rect[2] < targetRect[2]) {
    rect[2] = targetRect[2];
}
if (rect[3] > targetRect[3]) {
    rect[3] = targetRect[3];
}
```
2回目以降の処理では取得したvisibleBoundの値によって配列`rect`の値を更新します。
TensorFlow(keras)の使い方

##まえがき
今回の利用するプログラムは[GitHub](https://github.com/arunponnusamy/gender-detection-keras)のプログラムを使います。
このプログラムは、リアルタイムでの性別判別などを行うことができます。
入力データは、ビデオファイルや画像、webカメラの３つが使えます。

主に学習させたmodelの使い方を解説します。

数式なものは触れずに、kerasの使い方になります。

##必要なライブラリーのインストール

```terminal
pip3 install tensorflow
pip3 install cvlib
pip3 install opencv-python
pip3 install matplotlib
```


## STEP1　教師データの配置
教師データとなる、画像データを以下のようなディレクトリ構成で作成する。
Imageフォルダの場所はどこでもいいです。
画像サイズもバラバラで大丈夫です。

Image
  ├ man
  ├ woman

## STEP2 学習させる
モデルを学習させるます。
その前に、１点だけ解説します。
train.pyの中 
model.save(args.model)
で学習されたモデルを保存させています。args.modelのところの名前を変更していけば、
いろいろ試した結果を保存させておくことができるので、覚えておきましょう。
文字列で名前を指定する場合は拡張子が「.h5」になります。
例) model.save('gender_detect_model.h5')


では、ターミナルでtrain.pyのあるディレクトリに移動します。
以下のコードを打てば動くはずです。

```terminal
 python train.py -d 先程作ったフォルダのパス
```

## STEP3 モデルを使ってみる
今回の記事のメイン部分にです。
まずは、先程保存したmodelを読み込みます。
ここで、少しプログラムに変更を加えます。
gitからクローンしてきた状態ですと、学習済みモデルをawsからとってきているためです。
下記の部分を消します。

```detect_gender_webcam.py
# download pre-trained model file (one-time download)
dwnld_link = "https://s3.ap-south-1.amazonaws.com/arunponnusamy/pre-trained-weights/gender_detection.model"
model_path = get_file("gender_detection.model", dwnld_link,
                     cache_subdir="pre-trained", cache_dir=os.getcwd())

```

そのあとに、モデルの読み込みの部分を変更していきます。

```detect_gender_webcam.py
# load model
model = load_model(model_path)

#↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓以下のように変更↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
# load model
model = load_model('先程保存したモデルのパス')
```
これで、モデルの読み込みは終了です。
実行すれば動きますが、少し解説していきます。

まずは、Kerasではないですがopencvのところです。
先程のload_modelの下にcv2.VideoCaptureがあると思います。
その引数が0になっています。0はパソコンで設定されているwebカメラのことをさします。
引数に、ビデオのパスを指定すればビデオでも使えます。使える拡張子は、自分で調べてください。
aviとmp4は使えることを確認済みです。
例) video = cv2.VideoCapture('test.mp4')

VideoCapture～predictまでの大まかな流れは以下のとおりです。

ビデオをフレームごとに切り出す
　　　　↓
フレームをcvlibのdetect_faceにかけ、顔検出
　　　　↓
検出した顔を矩形で囲む
　　　　↓
顔の部分を切り出し、サイズなどを変更

次に、切り出した顔画像を使い、性別判断させます。

```detect_gender_webcam.py
model.predict(予測させたいもの)
```
返り値は、今回sigmoid関数を利用しているので確率です。
例) [0.4, 0.6]　（男性：女性)

そのあと、テキストを表示する処理等を行い最後に
cv2.imshow()
を行えば、結果をみることができます。

実行方法
qで終了できます。

```terminal
 python detect_gender_webcam.py
```

##まとめ
基本的に、予測をするときは.predictでできます。
react-native+jestで、babelのエラーに遭遇「Support for the experimental syntax 'classProperties' isn't currently enabled」

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)

・react-native + jestでの突然のエラーの個人的メモ

突然npm run testが 以下のエラーを出す様になった。

● Test suite failed to run

    SyntaxError: /Users/vitorcamacho/workspace/mbanka-earth/node_modules/react-native/jest/mockComponent.js: Support for the experimental syntax 'classProperties' isn't currently enabled (20:24):

      18 |
      19 |   const Component = class extends SuperClass {
    > 20 |     static displayName = 'Component';
         |                        ^
      21 |
      22 |     render() {
      23 |       const name =

    Add @babel/plugin-proposal-class-properties (https://git.io/vb4SL) to the 'plugins' section of your Babel config to enable transformation.

またbabelさんも物好きですね。と思いながら、issueを読むと、
.babelrcはdeprecatedになっていた。これからは、babel.config.jsを使うらしい。


.babelrcを削除してからの、、、


```json
// .babelrc
{
  "presets": ["module:metro-react-native-babel-preset"],
  "env": {
    "production": {
      "plugins": ["ignite-ignore-reactotron"]
    }
  }
}
```

babel.config.jsを作成することで、上記のエラーは直った。

```js
// babel.config.js
module.exports =  {
  "presets": ["module:metro-react-native-babel-preset"],
  "env": {
    "production": {
      "plugins": [
        "ignite-ignore-reactotron",
        "@babel/plugin-proposal-class-properties"
      ]
    }
  }
}
```

このフロントエンドのツールに振り回される感がすごく嫌い。
ES6皆使うのやめて、function構文だけでいいだろう。
jsの進化早すぎる。

参考url
https://github.com/facebook/react-native/issues/21075
の中ほどのコメント。