OmniAICreator/Qiita-1.07M huggingface dataset:
デスクワークが多いソフトウェアエンジニア向けのストレッチ

# 狙い
自分の肩コリ、腰痛の改善のためのメモ。
実際にやる場合は理学療法士に相談して行うと良いです。

プログラミングなどのデスクワークを長時間行うと、背中を丸、肘をつき顔を突き出した姿勢になりがちです。
そうすると、背中の僧帽筋、広背筋や脊柱起立筋、腰周りの腰方形筋、大腰筋、多裂筋、腸骨筋、大臀筋に凝りが生じます。
凝りが継続すると血流が悪くなり肩凝りや神経を圧迫し坐骨神経痛の要因になったりするので、
30歳を過ぎたらみなさんストレッチをしましょう。

＊私はふかふかの椅子に勢いよく座った時に腰に違和感を覚えて以降腰痛との付き合いが始まりました。
　症状がひどい時は、電車に立って５分移動するのも辛かったです。つり革で懸垂しながら電車に乗っていました。
　この症状も大臀筋と大腰筋膜張筋をほぐす事で症状が治ったので、もし同様の経験をされている方がいらしたら参考になればと思います。

# ストレッチ
椅子に座りながら出来そうなものを中心に記載します。

## 僧帽筋、広背筋1
立って気をつけをした状態から、
胸骨を上下に伸ばすイメージで胸を張ります。
３０秒から６０秒維持
元に戻します。
これを１０回くらい気が向いたときに行います。

胸を張るときに左右に胸を開くようにするのではなく、上下に張るのがコツです。
イメージは芸能人のオードリー春日という人の姿勢です.

## 僧帽筋、広背筋2
背中の腰に手を甲を当てて肘を外側に突き出します。
腕で三角形を作るイメージ
肘を前後にリズムよく動かします。
しっかりやると肩周りが熱を帯びてきて汗が出ます

ちょど良い動画がありました。これの１分くらいからの動き
https://www.youtube.com/watch?v=MbxqnHHECQg

## 脊柱起立筋
https://smartlog.jp/128766#S21316757
ここのブログの「背中のストレッチ5」が参考になります。


## 多裂筋・腰方形筋
寝転んで、両膝を立てます。足は、三角座りで背中は床付いている状態になります。
そこから両膝を左右どちらか側の床につけるように倒します。
この姿勢で１分以上。　
私の通っている理学療法士さんは７分くらいかけると良いと言っていました。
(私の腰周りは、石のように硬い状態なのでそう言ったと思います。)
筋肉は３０秒くらいで緩和するので、１分待たずに緩んできたと感じたら止めると良いでしょう。
終わったら反対側も行います。

http://quiizu.com/archives/14288
ここのブログが参考になります。

## 大臀筋、中臀筋
椅子に座った状態で、伸ばしたい方の外側の踝を反対側の足の膝の上に載せます。
片足だけ椅子の上であぐらをかいた状態。
深くお辞儀をします。
30秒から１分伸ばします。
反対も同様に行います。

https://www.goodspress.jp/howto/135912/2/
の腰のストレッチ①　が参考になります。

## 大腿筋膜張筋
説明が難しいですが、シェーのポーズで右足を上げずに左足よりも左外側の床に右踝をつけると右側が伸びます。
これも30秒から1分伸ばします。

http://yoshinashigotowo.blogspot.com/2014/11/blog-post_14.html
ここの写真のポーズを参考にしてください。

# 筋トレ
筋肉は左右、前後で引っ張って体を支えていますので、背中周りの筋肉を緩めたなら
大胸筋の筋トレ、ストレッチを行いバランスをとる
腰周りを伸ばしたなら、腹筋など体幹の筋トレを行ってバランスをとるなどしないと余計に悪化しますのでバランスを意識しながらやると良いです。
やみくもに一箇所だけストレッチをし続けるとそこに対応する反対側の筋肉に負荷がかかりますのでお気をつけください。

では、また次の機会に
kintone 運用 Tips

kintone の システム運用についての Tips を載せていきます。

# cybozu.com 共通管理

## システム管理

### 監査ログの文字化けをnkfで変換する

#### ダウンロードした監査ログをExcelで開きたい

ダウンロードした audit.csv の文字コードは UTF-8(BOM無し)なので、Excelでそのまま開くと文字化けします。

mac の場合は、nkf で変換します。

```bash
brew update
brew install nkf
nkf -v
Network Kanji Filter Version 2.1.5 (2018-12-15)
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
Copyright (C) 1996-2018, The nkf Project.
cat audit.csv | nkf -Ws > audit-sjis.csv
```

* [homebrew](https://brew.sh/)
* [nkf](https://ja.osdn.net/projects/nkf/)

---

気付いた時に書き足していきます。
moleという選択肢

「Webサーバー公開したいけどドメイン取得めんどい」
「アプリを簡単に公開してテストしてみたい」
そんなとき、簡単にローカル環境を外部に公開できるサービス、**mole**についてご紹介します。

#moleとは
moleとは、ローカル環境にあるサーバーを外部へ簡単に公開できるツールです。
コマンド一つで指定したポートのサービスにドメイン名を付与して公開することができます。

#インストール

###今回の環境
- MacOSX 10.15 Catalina
- bash

###環境構築
下記のコマンド一つでできます
`curl -L  dl-mole.freaker.io/install.sh |bash`

#いざ鯖公開
まず公開するサービスがなければ元も子もないので、簡単なWebサーバーをローカルで動かします。
今回はポート3000番で動かしておきました。
動いているのを確認できたら下記のコマンドでmoleを起動しましょう。

`mole -f localhost:3000`

初回起動時はjsonファイルを自動作成するかどうかと聞かれますのでyと答えておきます。
これ以降はmoleと打つだけで、同じ設定でサービスを公開することができます。

起動に無事、成功すると可愛い犬(blue)が表示されました。

```
 mole by RHEMS Japan
   
           .-"-.
         /|6 6|\
        {/(_0_)\}
         _/ ^ \_
        (/ /^\ \)-'
         ""' '""
 ==  Free plan running ==

 revision           master-d979add
 host               mole-route.io
 localEndpoint      localhost:3000
 http url           http://{自動生成されたアドレス}.mole-route.io
 https url          https://{自動生成されたアドレス}.mole-route.io
 tcp                mole-route.io ポート番号

 Press ctl+c or esc to exit
 START LOG FOR {自動生成されたアドレス}.mole-route.io
```

あとはこの画面に表示されているURLにアクセスすると、自分のローカルサービスが見れるはずです。

#無料プランと有料プラン
無料プランでも十分な体験を得られますが、有料プランになると以下のことが可能になります。

- ホスト指定
- サブドメイン指定
- ベーシック認証
- アクセス可能IP指定
- カスタムドメインの使用 

特にホスト指定では通信を管理するサーバーを指定することが可能になります。

#類似サービスとの比較
これに似たサービスとしてはserveoやngrokといったサービスがあります。
無料プランの場合と有料プランの場合で比べてみました。

serveoは,ssh-clientさえあれば使うことができますし、無料でもサブドメインを取得する事ができます。
しかし、単純なポート転送なので複雑なことはできません。

ngrokとの差は無料プランではあまりありません。

つまり無料プランではどれを使ってもさほどの問題はないでしょう。

有料プランになると、ngrokではできないホストサーバーの選択がmoleでは可能になります。
これにより、よりクローズドな環境で外部に公開することができますし、社内のサーバーをホストとすることが可能です。

つまりmoleには、他のサービスにはない高度な柔軟性を保持しています。

-------

生まれて初めてQiitaの記事を書きました。かなり読みづらいと思いますが、最後まで読んでいただければ幸いです。
初心者がRubyとAPIを使ってTwitterの予約投稿機能を作成してみました

###前提条件
APIを使ったことのないプログラミング初学者が、Twitterの予約投稿機能を作成するまでの学習メモです。

###実際にやってみてググったことリスト
1.　Twitter API の登録申請
2.　アクセストークンを取得する方法
3.　Rubyメソッド呼び出し方（Rubyの復習）
4.　Ruby Twitter API



###参考にしているサイト集

Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2019年8月時点の情報
https://qiita.com/kngsym2018/items/2524d21455aac111cdee

20分ではじめるRuby
https://www.ruby-lang.org/ja/documentation/quickstart/

Rubyで簡単なTwitter クライアントをつくる：予約投稿昨日作成する前にこのサイトを参考にタイムライン取得するためのプログラム作成しました。
https://qiita.com/shimisunet/items/c3a0b93fb13fa82ed8be

ツイートの自動投稿機能を作り出そう　ツイッターをRubyで使いたおす
https://www.nikkei.com/article/DGXNASFK2702K_X20C10A5000000/
【2019年】TwitterのAPIに登録し、アクセスキー・トークンを取得する具体的な方法
https://loumo.jp/wp/archive/20150916000032/

ruby で twitter api を使用する
https://miyastyle.net/twitter-api#2TwitterAPI

RubyでTwitter APIを使ってツイートする
https://qiita.com/enomotok/items/b1ff3bcd5d3ef8819845

###理解できてない用語リスト
- CONSUMER KEY
- CONSUMER SECRET
- ACCESS TOKEN：とは
- ACCESS TOKEN SECRET

###つまづいたところ
- アクセストークンて何？：めちゃくちゃいろんなサイト見て手こずったし、どこのファイルに何を書けばいいか分かるまで時間かけたなぁ。
- SSL証明書って何？
- 多分rubyの参考サイト少ないからrailsとかpythonで予約投稿機能について調べた方が色々見つかりそう。


###次の課題と気になるサイト
RubyでTwitterBotを作ろう！【導入編】
https://trap.jp/post/326/
スライドをMarkdownで一瞬で作れる！vscode-revealが速くてスゴい。

# スライド作成時間かかる問題
スライドを作るソフトウェアと言えば、

* Windows → PowerPoint
* MacOS → Keynote(PowerPointを使う人もちらほら)

という感じです。
しかし、「スライドを新規作成」→「文字を書く」→「良い感じにテキストを配置する」というステップを踏む必要があり、 **テキストベースで3枚くらいのスライドを作るにしても、15分くらいかかったり** でそこそこ面倒ですよね。

「LaTeXみたいにエディタで書いて、あとは良い感じに出力してくれたら良いのに」

そんな願いを叶える最強のツールがあるんです！

# vscode-reveal
## 概要
vscode-revealは **Markdown形式** で文字を書き、スタイリングなど自動で **良い感じに出力までしてくれる** VSCodeの拡張パッケージ(Extension)です。
VSCodeの拡張パッケージの中では、最近ぼちぼち有名になってきていることもあり、情報も増えてきています。

GitHubページは[こちら](https://github.com/evilz/vscode-reveal)。

## インストール
Extensionの検索で、「vscode-reveal」を入力してインストールしましょう。
それ以外で必要なHomebrewライブラリやDebianパッケージ等は特にありません。
![スクリーンショット 2019-10-18 18.32.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/270a0dda-bc60-65b1-4c2b-c56429d0a9f9.png)

## 使い方
こんな感じで、適当にmdファイルを作ります。

```slide.md
---
theme : "white"
transition : "default"
---

# 初めての<br>vscode-reveal

20191018

---

## vscode-revealとは

* VSCodeの拡張パッケージ
* Markdownでスライドを作れる
* こんな感じで **太字** もできる
* もちろん *イタリック体* も

---

どんどん活用していきましょう！
```

で、`command + shift + p`でコマンドパレットに移動し、「reveal」と入力。
「Revealjs: Open presentation in browser」を選びます。
![スクリーンショット 2019-10-18 18.40.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/72187985-4f4b-d14f-ab30-a2cc1e5dd249.png)


すると、
![スクリーンショット 2019-10-18 18.39.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/6fa501a9-f8c8-47ae-b527-2e0d201a3e00.png)
![スクリーンショット 2019-10-18 18.39.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/aa544f93-e0d8-4c04-146e-f613030ca69d.png)
![スクリーンショット 2019-10-18 18.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/f6bf1281-88f0-1b40-9c9f-84c9a2f84363.png)

こんな感じでブラウザでスライドが出力されます。
`←`や`→`でページめくりができ、ページ遷移も滑らかなエフェクトがかかるのでめちゃめちゃ良い感じです！（これは実際にやって試してみてください）

ちなみに、こちらはのスライドは **出力まで込みで5分かからず** に作れました。

## スライドについての補足
上記スライドのmdファイルですが。HTMLに置換されるため、タイトルを改行したい時はタイトル内で `<br>` タグを使えばできます。  
また、Markdown形式なので箇条書きはもちろん、太字やイタリックも使えます。
ページの区切りは `---` で指定します。

そして、冒頭で指定しているこちら。

```
---
theme : "white"
transition : "default"
---
```
ここでスライドの色やページめくりのアニメーションを指定しているのですが、色を黒くしたりアニメーションを消したりなどの設定ができます。
細かいデザインに気をつかずに、良い感じのスライドができるところが非常に良いですね！

# まとめ
Markdownでスライドを作ることができるvscode-revealを紹介しました。
シンプルなスライドであれば本当に一瞬で作れるので、ミーティングのアジェンダや、社内での共有会などに向いてるのかなと思ったりしてます。

色々面白い使い方ができそうなので、もう少し深掘りしてみようと思います。
OpenCVとNumPy環境におけるグレースケール画像生成

#初めに(^ω^)
画像処理を行っていく予定です。様々な画像を用いて画像処理を行う際には画像をそのままの形（カラー画像等データ量が多いもの）で扱うことは稀です。
カラー画像をグレースケール画像に変換して扱う場面が多くあります。
そのため、今回はグレースケール画像を作成してみたいと思います。
使用しているライブラリは[OpenCV](https://opencv.org/)と[NumPy](https://numpy.org/)です。
ライブラリの使用方法は、ソースコード内に出現した際に解説を入れていく予定ですので初心者の方も安心してみられると思いたいです（希望）

#作成したソースコード

```Python
#-----------------------------------------
# openCVとNumPy環境におけるグレースケール画像生成
#-----------------------------------------
import numpy as np
import cv2

#画像等の保存先
hoge = 'ファイルの場所(^ω^)'
#.txtデータ保存先指定
file = './hoge.txt'

#カラー読み込み
img_color = cv2.imread(hoge+'使用したい画像（拡張子付きで）')
#グレースケールで読み込み
img_gray = cv2.imread(hoge+'使用したい画像（拡張子付きで）',0)

#Numy配列に保存
arrangement = np.array(img_gray)
#画像サイズ取得
shape = arrangement.shape
#Numy配列に保存したものをテキストに書き込み出力
np.savetxt(hoge+file, arrangement, fmt="%3.0f", delimiter=",")

#配列出力
print (arrangement)
#画像出力
cv2.imwrite(hoge+'gray.png', arrangement)
```
#コード解説

##①importって？
```Python
import numpy as np
import cv2
```
importは自分が使用したいライブラリを宣言しているところです。
inport numpy as np
の一文は、numpyという文字列をnpと置き換えてかきますよという意味ですよ。

##②画像の読み込み方法
```Python
#カラー読み込み
img_color = cv2.imread(hoge+'使用したい画像（拡張子付きで）')
#グレースケールで読み込み
img_gray = cv2.imread(hoge+'使用したい画像（拡張子付きで）',0)
```
OpenCVの中にあるimread()を呼び出して画像を読み込みます。
cv2.imread()の使用方法は、
hoge = cv2.imrad([ファイルの名前],[オプション])
となっております。
コード内を見ていただけたらわかるかと思いますが、オプションのところに0を入れたら画像をグレースケールで読み込むことができます。

##③画像の中身をふむふむ（おまけ）
```Python
#Numy配列に保存
arrangement = np.array(img_gray)
#画像サイズ取得
shape = arrangement.shape
#Numy配列に保存したものをテキストに書き込み出力
np.savetxt(hoge+file, arrangement, fmt="%3.0f", delimiter=",")
```
数値計算ライブラリNumPyを用いてぐりぐりしました。
np.arrayを用いて画像の画素値をim配列にとろとろするために、NumPyの中にあるarray()を呼び出して配列を作成します。
np.array()の使用方法は、
hoge = np.array([画像を読み込んだ変数])
となっています。
そして、その画素値をテキストファイルに保存するためにNumPyの中にあるsavetxt()を呼び出してテキストを保存します
np.savetxt()の使用方法は、
np.savetxt([保存先のファイルの名前], [保存したい配列], [有効桁数],[区切る文字])
となっています。

##④画像の保存方法

```Python
#画像出力
cv2.imwrite(hoge+'gray.png', arrangement)
```
OpenCVの中にあるimrite()を呼び出して画像を読み込みます
cv2.imread()の使用方法は、
hoge = cv2.imwrite([ファイルの名前.拡張子],[保存したい配列])
となっております

これでコードの説明は終わりです（疲れた）

#参考文献
[note.nkmk.me](https://note.nkmk.me/python-opencv-imread-imwrite/)　様

[Python Examples](https://pythonexamples.org/python-opencv-read-image-cv2-imread/)　様

[DeepAge](https://deepage.net/features/numpy-loadsavetxt.html)　様

[NumPy 配列の基礎](http://www.kamishima.net/mlmpyja/nbayes1/ndarray.html)　様

#目次のようなもの
[Re：ゼロから始める機械学習生活（深層学習もあるよ）](https://qiita.com/KengoKudou/items/0973ee8f98315460b195)
ここに進捗状況等を載せてます。
今まで書いたものを一覧にしていたりするので見てみてください！
Windows PC の空きディスク容量が思ったより少ないときの対処法 3 つ

最近の Windows はディスクが無限にあるとでも思っているのか、やたらと余計なファイルを作りっぱなしにする構造のようです。しばらく使っていたら気がついたら空き容量がほとんどない、あるいはゼロという事態に直面したりします。また、古めのノート PC (Windows) を手渡されて、いろいろインストールしないといけないのに空き容量が全然空いていないといったときにも困ります。

そんなときの対処方法をまとめました。

## 0. 事前調査

まず、どのファイルのサイズが大きいのか調査します。これはどのツールを使っても良いですが [DiskInfo](https://forest.watch.impress.co.jp/library/software/diskinfo/) というのが結構良さげ。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38501/4a1847cf-b688-2d17-6df2-be684af4960c.png)

これを利用して、想定以上にサイズが大きくなっているフォルダを調べておきます。

## 1. C:\Windows\Installer

ここにはソフトウェアのアンインストーラーが保存されています。インストールするソフトウェアを最小限にしていれば理論的にはそんなに肥大化するはずがないと思いますが、どうも長く使っているといつのまにかサイズが大きくなってしまう様子。

そんなわけでここが肥大化していないかチェックし、大きいようならツールを使ってクリーンアップします。

ツールは [Patch Clearner](https://pc-chain.com/patch-cleaner/4002/) というのが良さそう。必要ないインストーラーを検出し、クリーンアップしてくれます。

## 2. C:\windows\winsxs

ここには Windows Update のパッチが保管されています。

システムが最新にさえなればいいのに、なぜこのフォルダに残骸が残り肥大化していく設計となっているのかよくわかりませんが、少なくとも GNU/Linux など他の OS では聞いたことがありません。

「ディスク クリーンアップ」で掃除できます。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38501/a9fabded-5d10-b147-df55-8abb8529ccd7.png)

ここで「システムファイルのクリーンアップ」を選択します。するとスキャンが始まるので、検出されたものをすべて選択して OK します。

## 3. その他のファイル

ThinkPad の場合、以下のフォルダがあれば除去します。

a) SWSHARE
b) SWTOOLS
c) drivers
d) valueadd
e) CMPENTS (if you have a tablet)
f) SUPPORT
g) I386

削除するには、まずこれらすべてのディレクトリをゴミ箱に移動して OS を再起動します。システムがクラッシュしない場合は、ごみ箱を安全に空にすることができます。

以上です。
SAS ViyaでPythonクラスからCASTableを作成する

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームです。PythonやJava、Rなどの言語を通して利用できます。そのSAS Viyaの中で使われているのがCASTableというテーブルオブジェクトです（CASはCloud Analytic Servicesの略です）。今回はデータベースやCSVではなく、Pythonのクラス（データメッセージハンドラ）を使って作成する方法を紹介します。

## データメッセージハンドラを定義する

`CASDataMsgHandler` のサブクラスとしてデータメッセージハンドラを定義します。

```py
class MyDMH(dmh.CASDataMsgHandler):
    def __init__(self):
        self.data = [
            ('Alfred',  'M', 14, 69,   112.5),
            ('Alice',   'F', 13, 56.5, 84),
            ('Barbara', 'F', 13, 65.3, 98),
            ('Carol',   'F', 14, 62.8, 102.5),
            ('Henry',   'M', 14, 63.5, 102.5),           
        ] 
        vars = [
            dict(name='name', label='Name', type='varchar'),
            dict(name='sex', label='Sex', type='varchar'),
            dict(name='age', label='Age', type='int32'),
            dict(name='height', label='Height', type='double'),
            dict(name='weight', label='Weight', type='double'),
        ]
        super(MyDMH, self).__init__(vars)

    def getrow(self, row):
        try:
            return self.data[row]
        except IndexError:
            return
```

## インスタンスを作る

定義したデータメッセージハンドラのインスタンスを作ります。

```py
mydmh = MyDMH()
```

## CASTableを追加する

CASTableを追加します。この時、作成したデータメッセージハンドラを渡します。

```py
conn.addtable(table='myclass', caslib='casuser',
              **mydmh.args.addtable)
```

### テーブル情報を見る

まずカラムの情報を見てみます。

```py
conn.columninfo(table=dict(name='myclass', caslib='casuser'))
```

**§ ColumnInfo**


| Column | Label | ID | Type | RawLength | FormattedLength | NFL | NFD |
|--------|-------|-----|-----|-----------|-----------------|-----|-----|
| 0 | name | Name | 1 | varchar | 7 | 7 | 0 | 0 |
| 1 | sex | Sex | 2 | varchar | 1 | 1 | 0 | 0 |
| 2 | age | Age | 3 | int32 | 4 | 12 | 0 | 0 |
| 3 | height | Height | 4 | double | 8 | 12 | 0 | 0 |
| 4 | weight | Weight | 5 | double | 8 | 12 | 0 | 0 |

データを見てみます。

```py
conn.fetch(table=dict(name='myclass', caslib='casuser'), to=5)
```

| name | sex | age | height | weight |
|------|-----|-----|--------|--------|
| 0 | Alfred | M | 14.0 | 69.0 | 112.5 |
| 1 | Alice | F | 13.0 | 56.5 | 84.0 |
| 2 | Barbara | F | 13.0 | 65.3 | 98.0 |
| 3 | Carol | F | 14.0 | 62.8 | 102.5 |
| 4 | Henry | M | 14.0 | 63.5 | 102.5 |

ちゃんと定義したデータメッセージハンドラの状態を使ってCASTableが作られているのが分かります。

## まとめ

データメッセージハンドラを使うことで、PythonのクラスをCASTableに展開できるようになります。データをWeb APIから取得してCASTableを作れば、外部データの分析も容易になります。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
CAS Tableでデータベースのデータをストリーミングで扱うには

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームです。PythonやJava、Rなどの言語を通して利用できます。そのSAS Viyaの中で使われているのがCASTableというテーブルオブジェクトです（CASはCloud Analytic Servicesの略です）。今回はデータベースと接続し、そのデータをストリーミングで扱う方法について解説します。

## データベースについて

今回はSQLite3を使います。SQLite3に接続して、カーソルを取得します。

```py
import sqlite3
sqlc = sqlite3.connect('iris.db')
c = sqlc.cursor()
```

このままSQLの実行もできます。

```py
c.execute('SELECT * FROM iris')
<sqlite3.Cursor at 0x7f6389f60420>
```

## データベースメッセージハンドラを作成する

このSQLiteかっらのメッセージを受け取るためのDB APIメッセージハンドラを作成します。

```py
dbdmh = dmh.DBAPI(sqlite3, c, nrecs=10)
```

さらにこのメッセージハンドラを使ってCAS Tableを作成します。

```py
conn.addtable(table='iris_db', caslib='casuser', 
              **dbdmh.args.addtable)
```

## 接続状態を確認する

カラム情報を調べます。

```
conn.columninfo(table=dict(name='iris_db', caslib='casuser'))
```

結果は次のように返ってきます。

**§ ColumnInfo**

| Column | ID | Type | RawLength | FormattedLength | NFL | NFD |
|--------|----|------|-----------|-----------------|-----|-----|
| 0 | sepal_length | 1 | double | 8 | 12 | 0 | 0 |
| 1 | sepal_width | 2 | double | 8 | 12 | 0 | 0 |
| 2 | petal_length | 3 | double | 8 | 12 | 0 | 0 |
| 3 | petal_width | 4 | double | 8 | 12 | 0 | 0 |
| 4 | species | 5 | varchar | 10 | 10 | 0 | 0 |

データを取得します。

```py
conn.fetch(table=dict(name='iris_db', caslib='casuser'), to=5)
```

| sepal_length | sepal_width | petal_length | petal_width | species |
|--------------|-------------|--------------|-------------|---------|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |

## まとめ

この方法の場合、データベース側のデータを変更すればCAS Table側でも更新されます。SQLite3以外のデータベースにも対応していますので、基幹システムのデータを可視化、分析するなどに役立ててください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
Expo + Firebase Authでパスワード再設定・メール確認覚え書き

# はじめに
[前回の記事](https://qiita.com/mildsummer/items/553840293a18553a4b80)の続きで、FirebaseAuthによるパスワード再設定のメールアドレスの確認を実装してみます。

# パスワード再設定のメールを送る
```javascript:redux.js
export const sendPasswordResetEmail = () => (dispatch) => {
  const email = store.getState().user.data && store.getState().user.data.email;
  if (email) {
    Alert.alert(
      'Reset Password',
      'We will email you instructions on how to reset your password.',
      [
        { text: 'Cancel', style: 'cancel' },
        {
          text: 'OK',
          onPress: () => {
            auth.sendPasswordResetEmail(email).then(() => {
              Alert.alert('The email has been sent to your account.');
            }).catch(function({ message }) {
              Alert.alert(message);
            });
          }
        },
      ]
    );
  }
};
```
簡便にダイアログ画面を表示するようにしてみました。
Redux実装のため`store.getState().user.data`で`firebase.User`インスタンスを取得していますが、そこは気にしなくて結構です。ユーザー認証が済んでいる状態で`firebase.auth.Auth`インスタンスの`sendPasswordResetEmail(email)`メソッドを使うとFirebaseプロジェクトからユーザーにメールが送信されます。
このメールの内容は、Firebaseコンソールの「Authentication」→「テンプレート」→「パスワードの再設定」から一部変更できます。

```
Hello,

Follow this link to reset your expo-auth-practice password for your %EMAIL% account.

https://<project name>.firebaseapp.com/__/auth/action?mode=<action>&oobCode=<code>

If you didn’t ask to reset your password, you can ignore this email.

Thanks,

Your <project name> team
```
このようになっています。再設定のためのリンク先を変更できるので、独自実装のページにすることも可能です。
その場合は[こちらの公式ドキュメント](https://firebase.google.com/docs/auth/custom-email-handler?hl=ja)にまとまっています。

# メールアドレスの確認
こちらもほぼ同様です。

```javascript:redux.js
export const verifyEmail = () => (dispatch) => {
  const user = store.getState().user.data;
  if (user) {
    Alert.alert(
      'Email verification',
      'We will send a verification link to your email account.',
      [
        { text: 'Cancel', style: 'cancel' },
        {
          text: 'OK',
          onPress: () => {
            user.sendEmailVerification().then(() => {
              Alert.alert('The email has been sent.');
            }).catch(function({ message }) {
              Alert.alert(message);
            });
          }
        },
      ]
    );
  }
};
```

メールアドレスの確認が完了したらアプリ側で画面を更新したいのですが、現状スマートにやる方法はなさそうなので時間をとって少し調べてみようと思います。

[Is there a way to know that a user clicked on the verification link?
](https://stackoverflow.com/questions/46938037/is-there-a-way-to-know-that-a-user-clicked-on-the-verification-link)

コールバックURLを使って、端末内で確認が完結する場合はアプリ画面に戻らせることはできるようです。

→[してみました(2019/10/19)](https://qiita.com/mildsummer/items/4d08591f719476c7da72)
JetsonNanoのROSにAndroidからデータを飛ばすJava

JetsonNanoにROSをインストールしてAndoridApp(java)からデータを飛ばすメモなど

##目次
* android_coreのダウンロード
* 拡張クラスの構築
* 実機インストール
* JetsonNanoで受け取りチェック


---

###android_coreのダウンロード
https://github.com/rosjava/android_core


###拡張クラスの構築

Javaのクラス参考にコンパイル前のデータ
https://github.com/rosjava/rosjava_core

拡張クラスを追加してmainで呼び出すようにする



###実機インストール

USB経由で直インストール

###JetsonNanoで受け取りチェック
```

起動
roscore

トピックをリスト表示
rostopic list

ノードをリスト表示
rosnode list

トピックを監視
rostopic echo /chatter

```

http://wiki.ros.org/ja/ROS/Tutorials/UnderstandingTopics




###余談
rosjava_coreのクラス書き換えて利用しようとしたですが、gradlew buildしてもエラー解消できなくて断念。。




##参考サイト

###android_coreに関して
android_core — android_core 0.1.0 documentation
http://rosjava.github.io/android_core/latest/

Building A ROS Android App
http://wiki.ros.org/ApplicationsPlatform/Clients/Android/Tutorials/Getting%20Started

How to build a simple rosjava package successfully- - ROS Answers- Open Source Q&A Forum
https://answers.ros.org/question/41455/how-to-build-a-simple-rosjava-package-successfully/




###rosjava_coreのビルドに関して

Java のバージョン間クロスコンパイル時の標準ライブラリについて (JDK 8 で Java 7 向けにコンパイルする場合など)
https://vcs.hatenablog.com/entry/java/cross-compile-bootclasspath

rosjava_core 0.1.6 documentation
http://rosjava.github.io/rosjava_core/latest/building.html

Command-Line Interface
https://docs.gradle.org/4.10.2/userguide/command_line_interface.html#sec:command_line_warnings

API Help
http://rosjava.github.io/rosjava_core/hydro/javadoc/index.html?overview-summary.html



###ROSにJSのWebSocketサーバー設置に関して

RosJavaを入れた記録
https://qiita.com/iwata-n/items/989bed3acc21ffb28521

rosbridgeとroslibjsを使ってJavascriptでROSのTopicを操作してみる
https://naonaorange.hatenablog.com/entry/2019/02/12/202800
【Java, Kotlin, stream】オブジェクトリストをプロパティ名で日本語ソートする

# オブジェクトのリストをプロパティ名で日本語ソートしたい！
- 折角なので（？）stream api で

# 実施環境
開発PC: Windows 10
Java: 8
Kotlin: 1.6

## Java版
#### List<Model> modelList にモデルリストが格納済み
- Model.name に日本語名が入っている

```java
	Collator collator = Collator.getInstance( Locale.JAPANESE );
	collator.setStrength(Collator.IDENTICAL);
	collator.setDecomposition(Collator.FULL_DECOMPOSITION);
	List<Model> kanaSortedModelList = modelList.stream()
		.sorted(Comparator.comparing(Model::getName, Comparator.nullsLast(collator)))
		.collect(Collectors.toList());
```

Comparator.naturalOrder() だとunicode順になってちょっと不自然だったので・・・。


## Kotlin 版
```kotlin
		// 日本語ソート
		val collator = Collator.getInstance(Locale.JAPANESE)
		collator.strength = Collator.IDENTICAL
		collator.decomposition = Collator.FULL_DECOMPOSITION
		val kanaSortedModelList: List<Model> =
            modelList.sortedWith(compareBy( nullsLast(collator) ){ it.name })
```

Kotlin の方が書き方はシンプルで分かりやすいですね。
【Xamarin.Forms】TabbedPageのタブ押下時に処理をしたい

#何がしたいのか
- TabbedPageのタブをタップした際に、何か処理をしたい。
- TabbedPage内にNavigationPageがあり、それをRootに遷移したい。
- 選択済のタブ押しても、Rootに遷移したい。

#どう実装したのか
まず、Forms側だとChangeイベントは取れたが選択のイベントがなかったので素直にCustomRendererを作成。

```c#:CustomTabbedRenderer.cs
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            if (e.PropertyName == "Renderer")
            {
                navigationBar = (GetChildAt(0) as Android.Widget.RelativeLayout).GetChildAt(1) as BottomNavigationView;
                navigationBar.NavigationItemSelected += ItemSelected;
                navigationPage = ((NavigationPage)(sender as TabbedPage).Children[0]);
            }
        }

async void ItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e)
        {
            this.OnNavigationItemSelected(e.Item);
            await navigationPage.Navigation.PopToRootAsync();
            MessagingCenter.Send(navigationPage, "doit!");
        }
```

Rendererの際に、NavigationBarのItemSelectedイベント設定と
NavigationPageを取得。
選択された際に、NavigationPageをRootに戻し
Messengerで強引に、処理を発火。

#おわり
なんかもうちょい綺麗に出来る気がするんですが、同じような記事が全くなくて
どうしようもありませんでした・・・。
知見溢れる方、ご指導頂けると助かります!
ROSに対応している360°カメラ調査＠201910


#ROSに対応している360°カメラ調査＠201910

THETA Vの方が性能高いがROSのプラグインが対応してるか不明。。

ROSじゃなくても
THETAもGalaxyGearもWifiでIP使ってAPI経由でいろいろできるらしい
これができればROSでしなくてもいいかも

- RICOH THETA S / V
- Galaxy Gear 360

***

##THETA S / V

![NoName_2019-10-18_15-54-6_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/383d513d-6ca3-9cc6-f1c5-bd18e4921373.png)


製品情報
https://theta360.com/ja/about/theta/s.html
https://theta360.com/ja/about/theta/v.html

ROSの対応状況
https://discourse.ros.org/t/cameras-with-360-fov-in-ros/1833/12



##Galaxy Gear 360

![NoName_2019-10-18_17-10-28_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/0254f5cf-2e42-430a-c37c-a242978d48b0.png)

製品情報
https://www.galaxymobile.jp/gear-360/

ROSの対応状況
不明

##OSC APIで映像取得

WifiすればAPIが利用できるらしいので、ROS経由しなくてもよさげのようで



##参考サイト

THETA VとTHETA SCの違いを比較検証！2つを比較してそれぞれの特徴を紹介
https://www.rentio.jp/matome/2018/09/thetav-thetasc-compare/

RICOH THETA Sをnode.jsから使ってみる
https://qiita.com/FePlus/items/aaeca40468d49786e2f5

Gear360をUnityで動かしてみた
http://www.noshimemo.com/entry/2016/07/28/034706

UnityでTHETA SのWifiストリーミングをする手法メモ
http://www.noshimemo.com/entry/2016/04/21/183439
Javaクローリングでプロキシサービス利用

# Javaクローリング処理でプロキシサービス利用
JavaクローリングPJでプロキシサービスを利用することになり他記事を参考に実装して見ました。
下記の２ファイルを追加することで簡単に適用出来ます。
・src/main/java/ProxySetConfig.java
・src/main/resources/proxy.properties

#ProxySetConfig.javaを作成
```
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
import javax.annotation.PostConstruct;

@Configuration
@Profile("pro")
@PropertySource("classpath:proxy.properties")
public class ProxySetConfig {
    @Value("${proxy.host}")
    private String host;

    @Value("${proxy.port}")
    private String port;
    
    @PostConstruct
    private void setProxy() {
        // Proxy for System
        System.setProperty("http.proxyHost", host);
        System.setProperty("http.proxyPort", port);
        System.setProperty("https.proxyHost", host);
        System.setProperty("https.proxyPort", port);
    }
}
```
上記の@Profile("pro")は
ローカルなら@Profile("local")
テストなら@Profile("test")に書き替えて切り替え出来ます。

#proxy.propertiesファイル作成
```
proxy.host=xxx.xx.xx.xxx
proxy.port=xxxxx
```
上記proxy.propertiesファイルの
proxy.hostとproxy.portを書き換えるだけでproxyの変更に対応できるのでとても便利です。

#参考サイト
https://kcf-developers.hatenablog.jp/entry/2018/09/04/112933
iPad SafariでフルスクリーンAPIを使う

# iPadのSafariでフルスクリーン表示したい

とある案件ではAndroidにおいてChromeのFullScreen APIを利用すれば、完全なフルスクリーン表示になり、疑似アプリとしてHTML表示ができたのだが、iOSだとそのままでは動かなかった。APIをサポートしてないのか？と思い、iPad(iOS)でも動くフルスクリーンの方法を調べました。

# アクセスガイドを用いた方法

[展示用にiPhone/iPadでWebページをフルスクリーン表示したままにする方法（アクセスガイド）](https://qiita.com/aosho235/items/b6c664fac66025edce25)にある、**アクセスガイド**を用いた方法だと、単にフロントで表示するアプリをロックできるだけで、いわゆる「フルスクリーン」表示にはなりません。

前提として、私が求めているフルスクリーンとは、

* ブラウザからの表示(HTML)が対象（JSのsetTimeout系もちゃんと動く）
* アドレスバーを表示しない
* ナビゲーションバー（画面下）を表示しない
* その状態でHTML表示/操作ができる
* すぐに解除されない
* クローズボタンが表示されっぱなしにならない

アクセスガイドを用いた方法は、アドレスバーが消えないため、フルスクリーンとはいえません。（もしかしたら、iPad(iOS)のバージョンによって、挙動が違ったのかも）

# ホームに追加+metaを用いた方法

もう一つ、iOSには、開いているページを「ホームに追加」することで、疑似アプリっぽく表示することができます。そのとき、html中のmetaを適切に記述することで、アドレスバーを非表示にすることができます。

[iOSでウェブサイトをフルスクリーン表示させる](https://mawatari.jp/archives/web-apps-like-native-apps)

```html
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
```

ただし、これには欠点があり、JavaScriptの動きにかなり制限が入るということです。詳しく検証はしていませんが、setTimeout(),setInterverl()などは動きません。つまり、アプリっぽく動かすことができず、ただそう見えるだけの状態です。リンクなどもタップするとsafariが起動するなど、リンクの工夫も必要です。


# 検証環境

今回検証した環境は以下の通りです。

* iPad mini 第五世代 (iOS 12.4)
* Mobile Safari 12.1.2

次に参考にしたのが、[Going Fullscreen On iPad Safari](https://bubblin.io/blog/fullscreen-api-ipad)

こちらを見ると、比較的新しいiPad+Safariであれば、FullScreen APIが実装されているようです。上記ページのコードを元に、必要最低限の実装をしてみました。

# サンプルコード
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="annnews" data-slug-hash="PooGdKw" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="iPadでFullScreen のテスト">
  <span>See the Pen <a href="https://codepen.io/annnews/pen/PooGdKw">
  iPadでFullScreen のテスト</a> by annnews (<a href="https://codepen.io/annnews">@annnews</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

上記CodePenを実行すると、PCでもフルスクリーンになり、iPadでも下記画像のように、フルスクリーン表示できました。ただし・・・

![IMG_20191018_104030.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13513/630348a0-b790-b833-079a-1233d2bb8439.jpeg)

見ての通り、左上に大きく、フルスクリーンを解除するボタンがけっこう大きめに表示されます。これを消す方法が分かりません。たぶん、Appleの考えからすると、任意にフルスクリーンを解除できないUIは認められないため、強制的に解除ボタンが付くのだと思います。

さらに、ページを少しでもスクロールされたり、スワイプしようものなら、フルスクリーンが即座に解除されます。

つまり、フルスクリーン状態は、あくまで動画などを前面に見せる手段でしかなく、疑似アプリとしてHTMLコンテンツを表示するための手段としては提供してないように思えます。

もしかしたらそのあたりを設定するオプションがあるかもしれませんが・・

Android/Chromeだと、FullScreen APIにて、フルスクリーン化、状態の取得、解除などJSで出来たのですが、iPadだと、ネイティブアプリ化するしかなさそうです。

引き続き調査中。
ルート(/)へのルーティング設定

## URLが「/」というルートの設定方法
「root」メソッドを使ったルーティングを設定する
## 記述方法
`root :to => 'コントローラ名#アクション名'`
もしくは
`root to: 'コントローラ名#アクション名'`
実務では
`root "コントローラ名#アクション名"`
## 具体例
`root :to => 'info#index'`
`root to: 'home#index'`
`root "home#top"`
## 参考URL
https://www.javadrive.jp/rails/routing/index2.html
https://techacademy.jp/magazine/7131
【Rails】Flashで表示される内容を改行させよう

#環境
以下の環境で実行しています。
・Ruby　2.5.5
・Rails　5.2.3

#実現したいこと
Flashで表示したい内容が複数ある場合に、一つずつ改行させて表示させる。

#実装
調べてみると、Flashの処理を書いているcontrollerに`<br>`や`html_safe`をつければ良さそう。
そこでコードを見てみると、

```ruby:microposts_controller.rb
flash[:danger] = @micropost.errors.full_messages.join(',')
```
バリデーションエラーが出た場合、エラーメッセージを","で区切り、文字列を返すようにしています。
調べた通りのままで実装する方法が思いつかなかったので、レンダリングしているHTMLファイルの方を修正しました。

```ruby:_flash_messages.html.erb
<% flash.each do |message_type, message| %>
  <div class="alert alert-<%= message_type %>">
    <% message2 = message.gsub(",","<br>") %>
    <%= message2.html_safe %>
  </div>
<% end %>
```

`div`の中の２行が修正した内容です。
まず、messageにgsubメソッドを使い","を`<br>`に置換します。
このままだと、`<br>`が文字列として表示されてしまうので、`<%= message2.html_safe %>`とします。
これでFlashの内容が複数行で表示されます。

#参考
[railsのflashを改行して表示をする方法](http://mikamisan.hatenablog.com/entry/2016/05/25/073845)
[bootstrap flashの改行について]
(https://teratail.com/questions/89839)
OutsystemsでSelect2を使ってみる

#はじめに

Outsystemsにて、Select2の記事がなかったのでメモ程度にここに記します。

#想定読者
これからSelect2を使ってみようかなって方

#Select2とは

こうゆうやつです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/382c9d39-8d4c-8c4c-6cad-c40681fbf270.png)

このSelect2で大きく2つの事ができます。


###A.検索ボックスが選択フォームに追加され、フィルタリング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/3e334219-008b-63f5-2b62-d27dd5a4cf6e.png)


###B.タグのように複数の値を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/021bc4d4-2516-f412-85ed-95ae316c65a2.png)


https://silkui.outsystems.com/Patterns_Web.aspx#Web_Featured_LightBox![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/d27e5cb3-9d79-a747-7126-46c7548dc631.png)



##Aの実装例

①適当なStatic Entityを作成。こちらは作りによってEntityでも可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/bb0cd65c-5048-356e-915a-21fe9b3ecf6b.png)

②ComboboxとSelect2を配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/86e139e7-d33d-1469-4d78-b324d154f746.png)

③ComboboxとSelect2の要素を紐付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/b8361ab6-57a9-cdb0-2aeb-4c71a0794e97.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/9e690279-26c5-c68f-a86f-6fa850088dc7.png)


④完成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/3c032161-bac6-a025-33fd-738c18b02e73.png)


##Bの実装例

①適当なStatic Entityを作成。こちらも作りによってEntityでも可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/f2047cb9-4929-8627-d842-02c12d8ecc46.png)

②ListboxとSelect2を配置

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/0f04a72e-8293-015d-10d9-036c78d65e67.png)

③ListboxとSelect2の要素を紐付ける。Preparetionにて、StaticEntityのAggregateを作成し、そのListをListbox渡す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/4a48e71a-b718-af7d-523e-e2454b39321f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/e65ed263-c15b-cd2f-ade3-2eb50c70cd77.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/cd62b9e3-abb5-ffc7-b39f-83306059b676.png)


④完成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/7484a070-b79d-45f7-09ba-7b889fa24e8f.png)


#終わりに
弊社で今年もアドベントカレンダーが開催されるようで、忙しくなりそうです..
[Laravel] AjaxでPOSTしようとすると "The payload is invalid"で怒られる

LaravelでSPAを作っていて、POSTを行うためにCookieから `XSRF-TOKEN` を取り出してヘッダに `X-XSRF-TOKEN` として付与してリクエストしていたら `500` エラー `The payload is invalid`で弾かれたのでその対処法です。

# TL;DR
ヘッダにつけるトークンを [decodeURIComponent()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent)して差し上げる

# くわしく
Laravelを使ったアプリケーションにPOSTリクエストする際は、基本的にCSRF対策がされているので、予めLaravelが発行したCSRFトークンを付与しないと `419` エラーで怒られます。通常のフォームからリクエストする際は特に意識する必要はありませんが、SPAなどで非同期にPOSTを行う場合は、Laravel様がリクエストのたびにCookieに書き込んでくださる `XSRF-TOKEN` という値をヘッダに含める必要があります。しかしながら、 `XSRF-TOKEN` を付与したにも関わらず、Laravel様に怒られてしまったのでその対処法です。

Cookie に `XSRF-TOKEN` として格納される値はURLエンコードされているので、 `XSRF-TOKEN` に含まれる `=` などのURLに使用できない文字はパーセントエンコーディングされて格納されます(`=` → `%3D`)。そのため、その値をそのままヘッダに `X-XSRF-TOKEN` としてつけても無効なトークンと見なされ、Laravel様に弾かれます。

したがって[decodeURIComponent()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent)を使ってパーセントエンコーディングされた文字を元に戻してリクエストに含めることで、Laravel様が正しいトークンとして認識してくださるようになります。

`%3D` が含まれてたり含まれてなかったりするせいで、たまにリクエストが通るのでよくわからなかった。

## 例
以下のような関数でCookieの値を取得するとする。

```javascript:getCookieValue
function getCookieValue(targetKey) {
  for (let cookie of document.cookie.split(";")) {
    const [key, value] = cookie.trim().split("=");
    if (key === targetKey) {
      return value;
    }
  }

  return "";
}
```

この関数で単純に `getCookieValue("XSRF-TOKEN")` とすると

```:X-XSRF-TOKEN
XeyJpdiIDInIyQWdNb2tzADRUXC9CVjFzQWVTVUpBPT0iLCJ2YWx1ZSI6InFiUlc3ZVo2RXVNVXl0OUFTZnc1UGRpK05kUlUzWUJhOENBDDRsVjRFWnFpZVFOaUSzaThyNDxYdzY5Z0lacG0iLCJtYWMiOiJjY2YzNDNhYTdhZGUyZTFkZDFhMGM2MzUxYjE1NTdjM2FiNzU2ZTU3NjA1YzYzYDc5NDJmOGE2NzVmNWYwOWQ4In0%3D
```

みたいな値(末尾に `%3D` がある)が取れるので、`decodeURIComponent` を使って

```:decodeURIComponent(X-XSRF-TOKEN)
XeyJpdiIDInIyQWdNb2tzADRUXC9CVjFzQWVTVUpBPT0iLCJ2YWx1ZSI6InFiUlc3ZVo2RXVNVXl0OUFTZnc1UGRpK05kUlUzWUJhOENBDDRsVjRFWnFpZVFOaUSzaThyNDxYdzY5Z0lacG0iLCJtYWMiOiJjY2YzNDNhYTdhZGUyZTFkZDFhMGM2MzUxYjE1NTdjM2FiNzU2ZTU3NjA1YzYzYDc5NDJmOGE2NzVmNWYwOWQ4In0=
```

になおしてヘッダに含める。

```javascript:axios_config
axios.interceptors.request.use(config => {
  config.headers["X-XSRF-TOKEN"] = decodeURIComponent(getCookieValue("XSRF-TOKEN"));
  return config;
});
```
beforeRouteEnterからvuex storeのactionを実行したいとき

ルーティング前に何がしかの判定をして、リダイレクトしたりとかしたいときありますよね。 
`somValue` が `true` のときだけ、遷移を許可したいとか。
別に非同期である必要はないのですが、今回はたまたま。

```javascript
import store from '@/store';
import { mapGetters, mapActions } from 'vuex';

export default {
  beforeRouteEnter (to, from, next) {
    store.dispatch('yourAction')
      .then(() => {
        if (store.getters['yourGetter'].someValue) {
          next();
        } else {
          next({ path: '/' });
        }
      });
  },

  created () {
    this.yourAnotherAction();
  },

  computed: {
    ...mapGetters('yourModule', [
      'yourAnotherGetter'
    ])
  },

  methods: {
    ...mapActions('yourModule', [
      'yourAnotherAction'
    ])
  }
}
```

https://github.com/vuejs/vuex-router-sync/issues/26

やりたいことは実現できたし、Vue.jsの作者がそう言ってるので、良いのかな、と思うのだけど・・・。


なんか・・・変な気がする・・・。これでいいのか・・・？

**※ツッコミお待ちしてます。**

## 参考
[Vue Router / ナビゲーションガード](https://router.vuejs.org/ja/guide/advanced/navigation-guards.html)
MATLABでポケモンの絵を書こう 

# マメパトかわいい
![mamepato.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/1eab88c5-f4b9-c7bd-89a2-7e8ee7353d9c.png)
こういうのをMATLABで書こうという記事です。

# まずは誰かが書いたのを探そう
さっそくズルをしましょう！
https://ja.wolframalpha.com/

ここでマメパトとかグレッグルとかウパーとかヌオーとか、ポケモン名を探せば大抵出てきます。
下の方に [コピー可能なテキスト] ってあるので、クリップボードにコピーしておきましょう。

![CopyText.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/4a577463-e330-b148-6fbf-9f9be3317caa.png)


# せっかくなので、あとはMATLABで。

グレッグルだと上の方に 「0 から 92π までのときのプロット」って書いてあるので、それを１行目に書きましょう。MATLAB だと clipboard コマンドを使えば、コピーしたクリップボードの内容をそのまま文字列で使ってくれます。


あとは特殊文字とか置き換えればいいね。

```matlab
t = linspace(0,92*pi,20000);

clip = clipboard('paste');
txt = textscan(clip,'%s','delimiter','\n');
txt = txt{1};

txt = replace(txt,'θ','*heaviside');
txt = replace(txt,'π','*pi');
txt = replace(txt,' ','');
txt = replace(txt,'sin','*sin');
txt = replace(txt,'t','*t');
txt = replace(txt,'(*','(');
txt = replace(txt,'-*','-');
txt = replace(txt,'+*','+');
txt = replace(txt,'r*t','rt');
txt = replace(txt,'sgn','sign');
txt = replace(txt,'*','.*');

x = eval(txt{1}(6:end));
y = eval(txt{2}(6:end));

fprintf('x = %s;\n',txt{1}(6:end))
fprintf('y = %s;\n',txt{2}(6:end))

comet(x,y)
axis equal
```


書けた書けた、いい感じ。
![greggle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/dc87a73b-8670-203e-30e3-d911858718d8.png)

# Simulink のサブシステムにもどうぞ
　1行目のlinspaceと、コマンドウィンドウに出てきた数式と、plot(x,y) を使ってサブシステムのマスクを作れば、いい感じのサブシステムになります。

![mamesub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/747055aa-bd86-181e-3b9c-7a6eb0e5663c.png)
build が完了したことを Vim の画面でお知らせするよ

`+clientserver` が有効で、Vim がコマンドサーバとして立ち上がっている状態で、
`vim --remote-expr 'popup_create("build completed!", #{pos: "center", close: "click", border: [], padding: [0, 1, 0, 1], tabpage: -1})'`
alias
`alias notifybuildcomp='vim --remote-expr ''popup_create\(\"build\ completed!\",#\{pos:\"center\",close:\"click\",border:[],padding:[0,1,0,1],tabpage:-1\}\)'''`
エスケープシーケンス多いな。。。まぁ vimrc に 1 つ function を用意すればいいだけの話かもしれませんが。
pythonライブラリインストール proxy設定失敗時の対処

◆環境：Anaconda3.7.3 (インストールはデフォルト設定。個別の設定変更なし。）

#pip でエラーになる場合
参考：https://gammasoft.jp/support/pip-install-error/
対処: proxy指定してインストールする

```
pip install pypiwin32  --proxy=http://proxy01.xx.co.jp:8080
pip install pyinstaller --proxy=http://proxy01.xx.co.jp:8080
```
※anaconda環境では, pip installしないのが望ましいが、パッケージが見つからない場合は上記で。

# conda install　でエラーになる場合
◆現象：conda install コマンドでpythonライブラリを追加しようとすると、
　　　下記エラーでインストールに失敗する。

```
$conda install -c conda-forge pykriging

CondaHTTPError: HTTP 000 CONNECTION FAILED for url
 <~~~~~~> An HTTP error occurred when trying to retrieve this URL. 
HTTP errors are often intermittent, and a simple retry will get you on your way.
 If your current network has https://www.anaconda.con blocked, please file a support request with your network engineering team. 

ConnectTimeout(MaxRetryError(....... 

```

◆原因：anacondaのHTTP接続設定の不足

◆対処：anacondaの設定ファイル .condarc の変更

◆対処概要　以下2つの .condarc ファイルに設定追記　
(1) C:\Users\ユーザ名\.condarc 		※ 個人ユーザー用　
(2) C:\ProgramData\Anaconda3\.condarc 	※ 全体（管理者実行時）
　　※(2)はインストール先なので個人によって違うかもしれない。C:\ProgramData 、C:\Program Filesの下など 。

◆対処手順　
①　２ファイル .condarc ファイルの内容を下記のように proxy_servers: 以下を追記する

```
ssl_verify: true
channels:
  - defaults
proxy_servers:
    http: http://プロキシ名:ポート番号
    https: https://プロキシ名:ポート番号

↑※記載例：https: https://proxy01.xx.co.jp:8080
```

※ .condarcがない場合は新規作成。ファイル名が「.」始まりなのでGUIでは作れない。
      	1.  condarc.txt」とかで新規ファイル作成      	2.  windowsコマンドプロンプトでコマンド実行「ren condarc.txt .condarc」
    ※インデントは空白4文字。（タブや、インデントなしでは書式エラーになる。）
    ※ proxyのアドレスはInternetExprolerの設定から流用した。
    ※ssl_vefity は不要やfalseでもいいのかもしれないが。Anaconda Promptでコマンド実行で先に追加していた。
	conda config --set ssl_verify no

②Anaconda Prompt を管理者として起動する。　①の設定でproxyが反映されているか確認。
    以下コマンド実行。 結果表示で　proxy: 以下にhttpとhttpsの設定があればOK。
	conda config -show

③ Anaconda Prompt 管理者としてインストールコマンド実行
　例：conda install -c conda-forge pykriging
Dockerを体系的に学び直してみた(概要編)

# 1.はじめに
少し前からDockerやkubernetesという言葉を耳にすることが増えてきました。
インターネットで検索したり、実際に触れている人に話を聞いたりなどしてある程度のイメージは掴んでました。

が、実際にDocker/kubernetesの環境が構築できるわけではないので、今回一から学び直して見ました。

参考にした書籍は、[Docker/Kubernetes 実践コンテナ開発入門](https://www.amazon.co.jp/dp/4297100339/)です。


# 2.Docker
## 2-1.そもそもDockerとは？
一言で表すと、「Dockerとは、コンテナ仮想化エンジンのこと」を指します。

言葉で表しても伝わりづらいと思いますので、以下の図で一般的なサーバと仮想マシンとDockerの違いについてまとめてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329544/3613ce05-8cea-ef63-db0f-9cb64cbcb536.png)
図2.1 一般的なサーバと仮想マシンとDockerの違い
(*)イメージしやすいようにアプリ内には、MWも含めています。


## 2-2.Dockerのメリット
Dockerのメリットは以下のようなものが挙げられます。

### ・仮想マシンと比べ、ゲストOSのオーバーヘッドが軽減される
上記の図2.1からわかるように、仮想マシンとの大きな違いは、ゲストOSがなくなっている部分です。
インフラエンジニアの方は気にすることが多いですが、OSの領域もリソースを消費します。
私はもともとこのOS領域のことをあまり考えていないこともあって、実際OS領域は、私の想像以上にリソースを使っているという印象を受けています。
参考がてらOS領域についていくつかあげておきます。
・[WIndows Server 2019](https://docs.microsoft.com/ja-jp/windows-server/get-started-19/sys-reqs-19)
・[RHEL7](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/chap-requirements)

また、仮想マシンを構築する場合は、ゲストOSも構築する必要が出てきます。(イメージファイルがあれば構築する必要はありません。)
DockerならゲストOSを構築する必要がないため、構築にかかるコストも削減できる上に、デプロイも軽量になります。

### ・MW等のバージョンの違いを検証しやすい
上記にも記載した通りゲストOSを構築せずにアプリケーションを軽量にデプロイすることができます。
また、コンテナをデプロイする際にMWのバージョンも変更することが可能です。
そのため、ローカルPCで通常通りのインストールに比べ、軽量にバージョンの差異を確認することができます。


# 3.まとめ
Dockerについて学んだことを書きました。
実際に触れてみないとわからないことも多いかと思いますので、実際に触れてみることがオススメです。

この調子でkubernetesについても勉強して自動復旧システム構築を目指していこうこ思います。

何か間違いや指摘事項あれば是非コメントください。
bitriseでiOSアプリをビルドしたときのメモ

## アカウント連携

- [https://app.bitrise.io/me/profile#/apple_developer_account](https://app.bitrise.io/me/profile#/apple_developer_account) でappleアカウントと連携。複数のteamに所属する場合、 Team IDをメモっておく（後のAuto Provisionで必要だった）


## Add New App

[[iOS] Bitriseを導入する手順について | DevelopersIO](https://dev.classmethod.jp/smartphone/iphone/prepare-for-ios-app-distribution-part-3/)

```
error: No profiles for 'xxxxx' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'xxxxx'. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to xcodebuild. (in target 'xxx')
```

と言われたので、AutoProvisionのワークフローを挟んでみる。

## Auto Provision

- p12証明書がアップロードされているかWorkflow Editor -> Code Signing -> CODE SIGNING CERTIFICATES を確認
- Team -> Connected Apple Developer Portal Account で 正しくApple Developerが選ばれているか確認する https://discuss.bitrise.io/t/major-noob-reporting-for-duty-sir-simple-ios-setup-not-working/3860

- Certificate and profile installerステップがワークフローの中に含まれていないか確認


> Certificate and profile installerステップがワークフローの中に含まれていないか確認してください。もしiOS Auto ProvisionとCertificate and profile installerのステップの両方がワークフローの中に含まれていた場合はビルドは失敗します。

[Bitrise Docs](https://devcenter.bitrise.io/jp/code-signing/ios-code-signing/ios-auto-provisioning/)

らしいので、Certificate and profile installerステップは消しておく。また、プロジェクトで `Automatically manage signing` を使っている場合、ワークフローエディタで `Should the step try to generate Provisioning Profiles even if Xcode managed signing is enabled in the Xcode project?`にチェックを入れる。

[BitriseのiOS Auto Provisionを導入してAdHoc配信のためのUDIDの更新作業をブラウザ上でぽちぽちするだけで完結させる話 - Qiita](https://qiita.com/abui/items/009ccf4dd981c223e913)


> Please open your project in your local Xcode and generate and ipa file with the desired distribution type and by using Xcode managed codesigning.

と言われたのでローカルでアーカイブを作成する
色々差分が出たのでgit pushする
だいぶ待ってでけた

## SlackにダウンロードURLを流す

[Bitriseでビルド完了時にSlackに投稿するまで - Qiita](https://qiita.com/powerispower/items/f8b9e358649df2e4b905)

## インストールページのQRコードも入れたい
- Create install page QR codeステップをSend a Slack messageの前に追加
- 生成された `$BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL`を `A URL to an image file that will be displayed inside the attachment`に入れておく
【初心者】データ構造についてまとめてみた

##データ構造とは
データ構造とは、大量のデータを効率的に管理するための仕組みのことです。
データの大きさや種類、実行する処理によって向いているデータ構造やアルゴリズムは変わってきます。

##データ構造の種類と特徴

|データ構造|特徴|
|---|---|
|配列|複数のデータを連続的に並べたデータ構造|
|リスト|複数のデータを順序付けて格納したデータ構造|
|スタック|最後に追加したデータから取り出す後入れ先出し方式（LIFO = Last In First Out)のリスト構造|
|キュー|最初に追加したデータから取り出す先入れ先出し方式（FIFO:First In First Out）のリスト構造|
|木構造|木の幹、枝、葉の関係のようにデータを管理するデータ構造|

##各データ構造の解説
###配列
データを一列に並べて管理するデータ構造。
初めに一定の領域のメモリを確保し、アドレスを指定してデータを格納する。
#####メリット
* インデックスを通して高速にアクセス可能。
* 配列の末尾のデータ挿入、削除が高速。

#####デメリット
* データが大きい場合に大量のメモリを消費してしまう。
* インデックス中間部分のデータ挿入、削除を行う際に要素をずらす必要があり時間がかかる。

###リスト
データを順序付けて格納したデータ構造。
各要素は実データとポインタから構成され、ポインタは次（または前）の要素へのリンクとなる。
#####メリット
* データをどの部分であっても挿入、削除が容易。
* データの要素数が可変。

#####デメリット
* データにアクセスするにはリンクをたどる必要があり時間がかかる。
* 前後のデータへのリンクを保持している分データのサイズが大きくなる。

###スタック
最後に挿入した要素から順に取り出すようなデータ構造。
後入れ先出し（FILO:First In Last Out）の構造。
#####メリット
* データの取得が高速。
* 再帰的な処理と相性が良い。

#####デメリット
* 中間のデータにアクセス不可。
* 何も考えずに使うとメモリリークを起こす。

###キュー
最初に挿入した要素から順に取り出すようなデータ構造。
先入れ先出し（FIFO:First In First Out）の構造。
#####メリット
* データの取得が高速。
* ファイルの入出力やWEBからのデータ入出力などと相性が良い。

#####デメリット
* 中間のデータにアクセス不可。
* 何も考えずに使うとメモリリークを起こす。

###木構造
一つの要素が複数の子要素を持ち、一つの子要素が複数の孫要素を持つ、というように階層が深くなるほど枝分かれしていく構造。
子の数が2に制限されている木を二分木と呼び、3以上の子を持つ木を多分木と言う。
#####メリット
* データの挿入、削除が容易で検索も早い。

#####デメリット
* 深さにばらつきがあると性能に悪影響を与える。

##参考
https://qiita.com/GushiSnow/items/70765a7cae52c0a1b2b8
https://qiita.com/maimax/items/dcff7206b747bf726ad8
https://hibiki-press.tech/learn_prog/uncategorized/stack-and-queue/254
Apache上で単独IPで複数のサイトを実行する+swaggerインストール

# やりたいこと
Apache上で単独IPに対して複数のサイトを実行したい

* redimine
* swagger

# 前提条件

* Cent OS7
* apache 2.4.6
* php 7.3
* composer v1.9
* redmine用のvhostsは済

# 新しいサイトTOPをとりあえず置く
```
touch /var/www/html/index.html //適当にHelloとか書いておく
```

# vhostを追加＋向け先変更
```
/etc/httpd/conf.d

cp -apr vhosts-redmine.conf vhosts-swagger.conf //コピーする

#NameVirtualHost *:80
<VirtualHost *:80>
    ServerName swagger.local
    DocumentRoot /var/www/html
</VirtualHost>
```

# DNS登録が必要なのでlocalのhostsにドメインを登録する
```
172.26.6.94 swagger.local
```
これによって名前解決ができなくても対象のサーバーに接続できるようになる

# 無事に表示された
![vhost01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54063/e9775294-e659-22ee-878a-98f737555d0b.png)

# swaggerの構築
## composer
```
[root@redmine01 conf.d]# composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.9.0 2019-08-02 20:55:32
```
## [swaggerインストール](http://zircote.com/swagger-php/Getting-started.html)
```
composer require zircote/swagger-php

Using version ^3.0 for zircote/swagger-php
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 6 installs, 0 updates, 0 removals
  - Installing symfony/polyfill-ctype (v1.12.0): Downloading (100%)
  - Installing symfony/yaml (v4.3.5): Downloading (100%)
  - Installing symfony/finder (v4.3.5): Downloading (100%)
  - Installing doctrine/lexer (1.1.0): Downloading (100%)
  - Installing doctrine/annotations (v1.8.0): Downloading (100%)
  - Installing zircote/swagger-php (3.0.2): Downloading (100%)
symfony/yaml suggests installing symfony/console (For validating YAML files using the lint command)
Writing lock file
Generating autoload files
```

## [swagger-UIインストール](https://qiita.com/noto0420/items/a5929b8c35d0f528eb06)
```
vim /etc/httpd/conf.d/vhosts-swagger.conf

<VirtualHost *:80>
    ServerName swagger.local
    DocumentRoot /var/www/swagger/swagger-ui/dist //DocRootを向けかえ
</VirtualHost>
```

## アクセス確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54063/fa5d003c-dfa5-3358-b116-58c1fe86af4a.png)
Git で特定の変更の変遷を調べる

`git blame` でもいいけど、何度も前に戻るのはつらい。
`git log -p -S "対象文字列"` で差分にその文字列が入っている commit だけを取り出すことができる。
`-p` は差分も一緒に表示する option。commit の一覧だけ見たかったら取り除く。
connpassAPIとwebhookを使い、slackに勉強会情報を通知する

####追記　<a href="#%E8%BF%BD%E8%A8%98">2019/12/22　状況報告</a>

####きっかけ
connpassの勉強会情報を自動で通知してくれるようにできないかと思ったのがきっかけです。メンバーになっている勉強会の情報はメールで通知がきますが、メンバーになっていない勉強会は通知が来ないため、不便です。なら自分で作てみようかな。

####説明
簡単に説明すると、connpassAPIを使い勉強会の情報を取得して、それをwebhookを使いslackに通知する感じです。自分の興味のあるキーワードを指定して、そのキーワードにヒットした勉強会情報を通知してくれます。  
データ取得（cronで決められた時間に実行）
　　　　　　　　　　↓
新規の勉強会があるかデータベースに格納されているデータと比較
　　　　　　　　　　↓
新規の勉強会があったらslackへ送信

####使ったもの
・さくらのVPS
・Python 3.6.8
・mysql 5.7.27
・webhook
・github（プライベートリポジトリ）
・cron

####問題点
作るにあたっていくつか問題点がありました。  
・古い情報の取得
あまり勉強会の開かれていないキーワードを指定すると、データを取得した日より過去の勉強会情報も取得されてしまいます。そのため、取得した情報が過去のものか日付比較の処理をいれました。
・関係のない勉強会の取得
connpassAPIのキーワード検索では、文章中にそのキーワードがあればヒットします。例えば、福岡県で行われるイベントをキーワードに指定して検索すると、文章中の講師紹介欄とかに福岡県出身とあったらヒットしてしまいます。なので、APIの検索では大まかに検索してもらい、あとの正規表現で開催場所を絞り込んでます。
また、開催場所だけでなく"python"，"セキュリティ"などのキーワードを検索した場合も、文章中にそのキーワードが含まれていればヒットします。（例えば、"セキュリティ的に身分の．．．"などイベントの内容と関係のないところでヒットしてしまう）そのイベントが頻繁に行われている場合、邪魔になってくるのでイベントのタイトルに対し正規表現を使い弾くようにしています。
####作ってみて
pythonは基礎をやった程度、データベースは講義の座学で学んだ程度だったため、うまくいかない事が多かったですが、とても勉強になりました。エラー解決するために色々調べるため、知識が増えたと思います。

####コード
<a href="https://github.com/houtarou-dism/connpassAPI-event-notification" target="_blank">https://github.com/houtarou-dism/connpassAPI-event-notification</a>

####追記
1ヶ月以上使っていますが、うまくいっています。（福岡県で検索をかけています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509180/137c061a-aed3-beea-01a9-56b09119678e.png)
EntityFrameworkで関連テーブルの要素をソートしたかった話

関連テーブルのレコードを複数持つレコードを取得するとき、関連テーブルの要素のソートされた状態で取得したい。

``` test.cs
var items = ctx.Item
	.Include(x => x.Tags)
	.Where(x => x.Tags.Any())
	.OrderByDescending(x => x.Id);
```

具体的に言うと上記のTagもソートした状態で取得したい。
しかし、Tagsのどれでソートするという情報をOrderByで書く方法がわからなかった。

``` test.cs
var items = ctx.Item
	.Include(x => x.Tags)
	.Where(x => x.Tags.Any())
	.OrderByDescending(x => x.Id)
	.ThenBy("Tags.Id"); // Tag.Idでソートをしたいがこういう書き方はできない
```

1時間くらい調べてみたがどうもできないっぽい？

できないのであればしょうがないので取得後にやるしかない。
しかし、表示部分でソート処理を入れると忘れたとき悲惨なのでこのメソッドチェーンに書いておきたい。

``` test.cs
var items = ctx.Item
	.Include(x => x.Tags)
	.Where(x => x.Tags.Any())
	.OrderByDescending(x => x.Id)
	.AsEnumerable().Select(x =>
	{
		x.Tags = x.Tags.OrderBy(tag => tag.Id).ToArray();
		return x;
	}).ToArray(); // 無理矢理。。
```

ちなみに.AsEnumerable()は終端操作ではないので遅延実行はできる。
上記で言うとToArray()で発火。

ただし、AsEnumerable以前のチェーンがクエリ発行の対象になるため、それ以降にWhereとか書いても実行SQLには反映されず、SQL実行後に生成されたIEnumerableへの操作となるため注意しなければならない。

バッドノウハウっぽい記事になってしまった。
もっとスマートなやり方がありそうだが、時間切れ。