OmniAICreator/Qiita-1.07M huggingface dataset:
音楽ファイルのファイル名をタグを利用して一括変更

初投稿です。更に、自ら思い立ったものを実装することすら初めてになります。至らない点等多々あるかと思いますがご容赦ください。

#はじめに
自動でタグ付けしてくれる機能を備えた音楽管理ソフトは多々ありますが、意外とそれに合わせてファイル名を一括で変更してくれる機能を持ったソフトは見ません。おそらくその機能を見落としているだけだとは思うんですが、いい機会なので勉強もかねて、タグに準じてファイル名を変更する機能をPython3で実装してみようと思います。

#**概要**
ディレクトリを指定して、内部のファイルのリストを作成。その後拡張子より音楽ファイルを識別し、タグをもとにファイル名を変更するような機能を実装します。

#**実装の手順**
##mutagenのインストール
ターミナルより、`$pip install mutagen`で、mutagenという音楽ファイルのタグを編集するモジュールを読み込みます。これにより、数多くの形式の音楽ファイルのタグをいじれるようになります。

##ソースコードの記述

```sample.py
import os
from mutagen.flac import FLAC
from mutagen.easyid3 import EasyID3

def name_change():
    os.chdir('～音楽ファイルの格納されたディレクトリの絶対パス～')
    filelist = os.listdir(os.getcwd())

    for file in filelist:

        path = os.path.join(os.getcwd(), file)

        #tagsにタグのディクショナリを読み込む
        if file.endswith(".flac"):
            tags = FLAC(file)
            end = ".flac"
        elif file.endswith(".mp3"):
            tags = EasyID3(file)
            end = ".mp3"

        #ここから拡張子の対応を増やせる


        #文字列を取り出す
        name = ','.join(tags['title'])


        i = 1
        original = name
        name = original + end

        if name != file:
            while os.path.exists(name):
                    i += 1
                    name = original + " " + str(i) + end

            os.rename(path, name.replace("\"","").replace("\\","").replace("/","").replace("*","").replace(":","").replace("|","").replace("<","").replace(">","").replace("?",""))
```

###**import**
osはディレクトリ内のファイルのリスト作成やファイル名の変更、FLACはflacファイルのタグの辞書化、EasyID3はmp3ファイルのタグの辞書化に用います。

###**ディレクトリの指定とディレクトリ内のファイルのリスト作成**
 `os.chdir('絶対パス')` によってディレクトリの移動を行い、 `os.listdir()` でファイルのリストを作成します。 `os.getcwd()` はカレントディレクトリの絶対パスを返す関数です。

###**ファイルを1つずつ見ていく**
ここからはfor文の中に入り、1つずつファイルを操作します。

1. パスをくっつける関数 `os.path.join()` を用いて、pathに操作するファイルの絶対パスを格納します。
2. if文と、 `endswith()` 関数を用いて、選択しているファイルの拡張子を調べます。分岐したのち、拡張子に対応した方法でtagsというディクショナリーを作成します。また、この時忘れずに拡張子も文字列として保存してください。今回書いたコードではmp3とflacのみの対応ですが、importしたのちにこの部分を書き加えることでほかの拡張子にも対応することができます。
3. nameにタグの中身を保存します。私はファイル名は長くなると見にくいので曲名だけにしましたが、この辺をうまくいじったり、ほかの変数にほかのタグを入れたりすることで、「アーティスト名 - タイトル」のようにファイル名を変更するプログラムも作れます。*辞書の中身の文字列だけ取り出すいい方法がイマイチわからなかった・・・*
4. originalという変数にタグのタイトルのみを格納したのち、nameの中身をタイトル + 拡張子となるようにします。この時点でタグからタイトルを取り出す作業は終わりです。
5. if文でファイル名に変更が必要かどうかを判定したのち、while文を用いてファイル名の重複が起きないように命名していきます。今回は、「タイトル 数字 拡張子」となるようにしました。このために拡張子を別で穂損したんですね。これをしないと同じ名前の曲があったときに消えるファイルが出てきます。~~この作業アイドルマスターのオタクには非常に重要になってきます~~。最後に、os.renameの関数で実際にファイルを指定しリネームしてコードはおしまいです。この際、`.replace()`を連立させることで、使用禁止文字を消し飛ばします。

#おわり
これまでCでプログラミングを勉強していたんですがPythonほんとに便利ですね。優しすぎて不安になってきます。こんなにあっさりできるとは思いませんでした。絶対パスの指定を実行時にもできるようにするとか拡張子の対応を増やすとかできそうなところからもっと実用的にしたいですね。ちなみにMusicBeeだとタグからの命名がすごく簡単にできます。おすすめです。私はAIFFファイルのタグ付けが非対応なので常用はできませんが・・・

##更新情報
ファイル名を変更する際、タグに使用禁止文字が含まれていた場合の不具合を修正しました。

#参考にさせていただいたサイト
[PythonでFlacファイルを扱う](https://otonoki3d.wordpress.com/2015/09/13/python%E3%81%A7flac%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%89%B1%E3%81%86/)
[Python osを使ったファイルの動作、操作。パスの操作などなど]
(http://nonbiri-tereka.hatenablog.com/entry/2014/03/14/195241)
PDFをコピペした時の改行を消す方法

適当なブラウザのアドレスバーにコピペして再度コピーすれば消えます。
DeepL翻訳や引用時に便利。

# 操作
1. ブラウザのアドレスバーに改行を消したい文書をCtrl+Vで貼り付け
2. Ctrl+A、Ctrl+Cで再コピー

# 実践
そのままコピペすると余分な改行が入る。
<img src="https://qiita-image-store.s3.amazonaws.com/0/278803/e0e13f4e-5e69-aa47-a6f1-60d3ae398c60.png" width=50%>

![before.PNG](https://qiita-image-store.s3.amazonaws.com/0/278803/a4cbe4ce-c2e0-4f4e-6f2a-5c9403ee15b0.png)
一旦アドレスバーに貼り付けて
![貼り付け.PNG](https://qiita-image-store.s3.amazonaws.com/0/278803/126b0357-b1e6-59e3-c8c8-58c9d019078d.png)
再コピペで置換完了
![after.PNG](https://qiita-image-store.s3.amazonaws.com/0/278803/fc75c85e-116f-c5ed-0d10-a881f1e8c59b.png)


Wordや適当なツールで改行コードを置換するよりはるかに簡単だと思います。
ScrollRevealでgoogleフォントを読み込んだSVG画像を使う

#ScrollRevealとは
スクロールした時に要素がふわっと表示されるアニメーションを簡単に実装できるライブラリです。
軽量かつ、jQueryなどのライブラリに依存せず、cssも必要ないため、スクロールアニメーションをパパッと実装できます。
[ScrollReveal](https://scrollrevealjs.org/)

#なんでハマったか
今回はSVGのフォントにgooglefontsを使いたかったのです。
また、SVG画像はアウトライン化せずに、使用したいところでした。

###失敗例
1. imgタグで呼び出す　→　googlefontsが読み込めませんでした。
2. svgタグで呼び出す　→　svgタグの中のいろーーーんなタグ全てにScrollRevealが適用される。結果表示されず。（ヘッダーフッター以外全てにScrollRevealを適用したかったので細かい範囲指定が面倒だった）



#結論
objectタグで呼び出す　→　別documentとして扱われるらしく、ScrollRevealが<object>のみに適用され、googlefontsも問題なく読み込んだ。

```html:html
<object type="image/svg+xml" data="hoge.svg" class="scrollreveal"></object>
```
```html:hoge.svg
<svg>
<style type="text/css">
	@import url('https://fonts.googleapis.com/css?family=hoge:300');
	.hoge{font-family: 'hoge', sans-serif;
		font-weight: 300;}
</style>
・・・
以下省略
```
メソッドの引数に補完される文字について

androidstudioでの開発を行っております。
以下、クラスメソッド（だけとは限りませんが）の呼び出し時の引数について教えて頂ければと思います。


AAA.pushButton("1")

と入力した際に

AAA.pushButton( s: "1" );

と自動的に補完されます。
's:'　は　stringですよ、といった意味だとはなんとなく分かりますが、これは何という技法なのでしょうか？無くてもいいような。
CloudFormationスタック作成エラー: Requires capabilities : [CAPABILITY_NAMED_IAM]

[docomo Developer support](https://dev.smt.docomo.ne.jp/)の[@akatsukaha](https://qiita.com/akatsukaha)です

簡単なエラーですが備忘録としてメモします．

CloudFormationでIAMロール作成時などに下記のようなエラーメッセージが出たら，IAM関連の確認にチェックが入っているか確認します．

```
スタックの作成エラー: Requires capabilities : [CAPABILITY_NAMED_IAM]
```

![スクリーンショット 2018-07-27 22.08.49.png](https://qiita-image-store.s3.amazonaws.com/0/262328/94c7139a-be3d-02d7-36c3-3b03b0151903.png)

チェック入っていないからダメ

![スクリーンショット 2018-07-27 22.09.01.png](https://qiita-image-store.s3.amazonaws.com/0/262328/871c7e5b-a32f-de2d-a2dd-14383d1ffe20.png)

チェック入れて実行すればOK

![スクリーンショット 2018-07-27 22.12.19.png](https://qiita-image-store.s3.amazonaws.com/0/262328/7248e6a1-038f-a578-27d2-73443534be05.png)

AWS CLIでも同様にIAM関連の処理を入れる場合はパラメータ(CAPABILITY)で指定しないとエラーになるので注意．
Xcodeのアセットカタログで拡縮する設定メモ

最近、古いアプリをiPhoneXなどでも正しく表示されるような地味な作業をやっていますが、気にしていなかたXCode機能（Xcodeのアセットカタログで拡縮する）を使いしましたのでメモ書きでご紹介します。

## グラデーション、角を丸くしたイメージはどうするか
古いアプリのイメージだとグラデーション表示、角を丸くするようなことをよく見かけます。これをそのまま使っちゃうと角の丸くしたことろが伸びてしまったり、グラデーションがぼやけたりします。それをIB上の設定を少し加わるだけで正しく表示されるようになります。

## Scale項目
項目名どおり、スケール指定です。古いアプリだと1xしかないはずなので僕は`single scale`に設定しました。

<img width="800" alt="スクリーンショット 2018-08-06 13.13.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/32323/e3457b54-674d-ed1a-a7a8-10bf4866260f.png">

## Show Slicing, Slicing
拡縮モードにするにはImage Previewの右下`Show Slicing`を選択し、イメージに表示された`Slicing Start`を選択します。
（プロパティーの`Slices`をモードを選択しても良いです。）
<img width="800" alt="スクリーンショット 2018-08-06 13.19.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/32323/59d01975-1afe-7eeb-5a7f-e59bf52c5bef.png">

## Slicing調整する項目

<img width="600" alt="スクリーンショット 2018-08-06 13.23.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/32323/47bfb0fc-a815-d123-b52e-c95d8512a405.png">

### Slices
拡縮を横、縦、両方を選択します。
僕の場合は`Horizontal and Vertical`を選択し調整します。

<img width="240" alt="スクリーンショット 2018-08-06 13.25.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/32323/49fe943e-ee26-3cd5-5116-dcb2938bda55.png">

### Left, Right, Top, Bottom
指定した左(右、上、下)の時点からスライスをしますと意味です。指定値より小さい領域はsliceしません。
（添付の図では8を設定いますが、0~8まではスライスしないことになります。）


### Center
伸ばす（スライス）処理をする方法を選びます。`stretches`は指定した領域を伸ばします。`tiles`は指定領域をタイルみたいに貼り付けるようなイメージです。
僕の場合グラデーション処理があったため、`stretches`を選択しました。



#### Width, Height
Centerに指定されたスライス処理の領域に指定です。

<img width="600" alt="スクリーンショット 2018-08-06 13.43.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/32323/3ea67e8b-363e-c76a-7de1-0bff13b7b50a.png">


## 結論
書いてみたら説明をするほどではない気もしますが。。以上です。
UTF-8文字列として不正なバイト列を取り除くワンライナー

UTF-8文字列でマルチバイトの境界を意識せずにバイト数で文字列を切り捨てたりすると、
不正なバイト列が混じったりすることがあります。

たとえば `こんにちわ` という文字列を8バイトで切り捨ててみます。

```
$ ruby -e 'puts "こんにちわ".byteslice(0...8)'
こん
```

UTF-8で日本語のひらがなは 1文字で3バイトです。
`こん` の2文字までしか印字できていませんが、
odコマンドでバイト列を見てみると、末尾に不正なバイト列 `e3  81` が混じっています。

```
$ ruby -e 'puts "こんにちわ".byteslice(0...8)' | od -tcx1
0000000   こ  **  **  ん  **  ** 343 201  \n
           e3  81  93  e3  82  93  e3  81  0a
0000011
```

このように出力の文字列をパイプで後続のプログラムに渡したりすると、後続のプログラムが不正なバイト列を受け取ります。

根本的には、出力側が不正なバイト列にならないようにマルチバイトの境界を意識して、切り捨てるべきです。

例えば Ruby / Rails の場合

[Ruby / Railsでマルチバイト文字の境界を意識しつつ指定のバイト数以下に切り捨てる](https://qiita.com/minamijoyo/items/5f18dac63e7b9fa70a78)

ただ出力側のプログラムが、簡単にいじれない場合は、さしあたりiconvコマンドで、不正なバイト列を除去することができます。
iconvの入出力のエンコードをutf-8で同じものを指定しつつ、 `-c` で変換できなかったバイトを捨てます。

```
$ ruby -e 'puts "こんにちわ".byteslice(0...8)' | iconv -f utf-8 -t utf-8 -c | od -tcx1
0000000   こ  **  **  ん  **  **  \n
           e3  81  93  e3  82  93  0a
0000007
```

暫定の回避策としてお使い下さい。
bashで連番ファイルを作成する

## 背景
Dropboxみたいなクラウドストレージに大量のファイルを配置した時にどんな挙動になるのかをテストする際に、連番ファイルを作成する必要がありました。

## 解決策
`{0..10}` などとすると連番が生成できる。これはbashのブレース展開という機能。これを使って、以下のように `touch` コマンドを合わせると、連番ファイルを簡単に作ることができた。

```sh
touch {0..10}
```

上記例だと中身が空っぽのファイルができあがる。なにか適当な文字列を書き込んだファイルを作りたいなら以下のようにするとできる。ただし、何百、何千といったファイルを作る場合はエラーが出てしまう可能性がある。 (`too many files open` みたいなエラー)

```sh
echo "hoge" | tee {0..10}.txt
```

以下のようにやれば、2000個とかの大量のファイルもいけた。まずはファイルを作成しておいて、後からそれらに文字列を流し込む、ということ。

```sh
# 連番ファイル作成用の空のフォルダにいる前提です。
touch {0..2000}.txt
ls -1 | xargs -I {} sh -c 'echo hoge > {}'
```

## 注意
fish だとこの書き方では動かない。 `{0..10}` のような文法が存在しないらしい。以下の記事のような記法を使えば、fishでも多分同じようなことできる。

[@ryotako fishでも{1..9}を展開したい！ https://qiita.com/ryotako/items/70827643a20fa60b2547](https://qiita.com/ryotako/items/70827643a20fa60b2547)


## あとがき 
以下の点が便利だと感じた。シェルスクリプトあんまり使いこなせていない。。。

　* `xargs` を使って `{}` に前のコマンドの出力を流し込む。
　* `sh -c` を使って `xargs` で引っ張ってきた引数を突っ込んだシェルスクリプトを動かせる。
openframeworksでglsl入門

##はじめに
openframeworks第二弾記事です。普通にopenframeworks入門続編してもよかったんですけど、UnityとかprocessingとかTDとか他のフレームワークでも応用利きそうな部分からせめていこうと思いopenframeworksでのglsl入門書いてみました。
なお今回のゴールは[thebookofshaders](https://thebookofshaders.com/01/?lan=jp)内のハローワールドをopenframeworks通して実装するまでにします。

##GLSLって??
openGLとかで用いられるシェーダー言語の一つです...
じゃあシェーダーって何なのってなるんですけど、まあ大雑把に言うと描画処理を行うプログラムのことです。詳しくはthebookofshadersとかで説明されているので読んでみるのがおすすめです。

##プロジェクトの作成
同じ内容をなんども書くのは冗長なのでやり方わからないよーって人はここみてください。
[macでopenFrameworks入門してみた](https://qiita.com/ryosukeeee/items/8e758fd179c4a4f5d1fc)
##シェーダーファイルの格納
では本題に入って行きますー
openframeworksでglslを扱うにはC++のソースコードとは別にシェーダーファイルを用意してあげる必要があります。
今回はフラグメントシェーダーを使うのでshader.fragを用意して[myproject]/bin/data配下に格納しましょう。


##HelloGLSL!
ここではglsl入門と言うことでThebookofshader内のハローワールドまで実装して終了します。
[myproject]/bin/data/shader.fragを以下のように編集してください。

```
                                                                                                                                                                                     
void main(){
  gl_FragColor = vec4(1.0,0.0,1.0,1.0);
}

```
これでGLSLの処理の実装は完了です。あとはof側でこれを受け取る処理を行います。

src/ofApp.hの編集

```
class ofApp : public ofBaseApp{
 public:
　 void setup();
   void update();
   void draw();
   中略
   ofShader shader;
}
```
src/ofApp.cppの編集

```
void ofApp::draw(){
    shader.load("","shader.frag");

    shader.begin();
    shader.setUniform1f("u_time", ofGetElapsedTimef());
    shader.setUniform2f("u_resolution", ofGetWidth(), ofGetHeight());
    ofRect(0,0,ofGetWidth(), ofGetHeight());
    shader.end();
}
```
これでopenframeworksでglslの描画を受け取れるようになりました。この状態でopenframeworksを実行するとこのように画面が全てピンクに塗り潰されたものが表示されます。
<img width="1023" alt="スクリーンショット 2018-08-06 12.16.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/255246/42a0144c-448d-6c9f-03a5-ed67e88453df.png">

これでglslによる画面の描画は成功です!...と言ってもこれだけでは何がすごいのかわかり辛いですが...

##解説
解説と言うほど大したものではないですがメインの処理はこの部分だけです。
`gl_FragColor = vec4(1.0,0.0,1.0,1.0);`
ここで行なっているのは画面のrgbaの指定です。この場合r(red)==1.0、g(green)==0.0、(blue)==1.0、a(alpha)==1.0を指定しています。


参考文献
https://yoppa.org/tau_media15/6375.html
https://thebookofshaders.com/01/?lan=jp
Rocket.Chatサーバーのインストールをした

Rocket.Chatサーバーのインストールをしたら結構大変だったのでメモを残しておく。

CentOS 7 7.2.1511
Rocket.Chat 0.68.3
NodeJS 8.11.3
gcc 4.9.4


めんどくさかったのは
　Rocket.Chat 0.68.3をインストールするにはNodeJS 8.11.3が必要
　↓
　NojeJSをソースからビルドしようとしたらgcc 4.9.xが必要
　↓
　gccをソースからビルド
と芋づる式に手順が増えていったこと。あとビルドにやたらと時間がかかること。



## インストール手順

gcc 4.9.4をインストールする

```
$ yum -y install gcc gcc-c++ wget bzip2 libmpc-devel mpfr-devel gmp-devel glibc-devel.i686
$ wget ftp://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-4.9.4/gcc-4.9.4.tar.bz2
$ tar xvfj gcc-4.9.4.tar.bz2
$ cd gcc-4.9.4
$ ./configure --enable-languages=c,c++ --prefix=/usr/local --disable-bootstrap --disable-multilib
$ make
$ sudo make install
```

NodeJS 8.11.3をインストールする

```
$ wget https://nodejs.org/dist/v8.11.3/node-v8.11.3.tar.gz
$ cd node-v8.11.3
$ configure --prefix=/usr
$ make
```
ビルド中に```GLIBCXX_3.4.20' not found```っていわれてエラーになる。

```
$ cd ../gcc-4.9.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs
$ sudo cp libstdc++.so.6.0.20 /usr/lib64
$ cd /usr/lib64
$ sudo mv libstdc++.so.6 libstdc++.so.6.bak
$sudo ln -s libstdc++.so.6.0.20 libstdc++.so.6
```
NodeJSをまたビルドする

```
$ cd ~/node-v8.11.3
$ make
$ sudo make install

```


RocketChatサーバーをインストールする

```
$ sudo yum -y install epel-release
$ sudo yum install --enablerepo=epel mongodb-server mongodb GraphicsMagick
$ wget --trust-server-names https://releases.rocket.chat/latest/download
$ mv rocket.chat-0.68.3.tgz?25386d35ef263589cfb941d33c8a855a-19 rocket.chat-0.68.3.tgz
$ tar xvzf rocket.chat-0.68.3.tgz
$ mv bundle /var/rocket
$ cd /var/rocket/programs/server/
$ npm install
```

インストールできた。
RocketChatのセットアップについては省略。


---
以下のページを参照

- [Node.js のインストール（ソースから）](https://qiita.com/silverskyvicto/items/a57b6296ff3238b1547c)
- [gccをソースからビルド／インストールする](https://qiita.com/liveralmask/items/6ed4a98ebb3bf6b7f707)
【Swift】UITextViewに表示したHTMLのフォントサイズを変更する方法

## フォントサイズを変更したい

[【Swift】UITextViewにHTMLを表示する方法](https://qiita.com/toshi586014/items/ab0f3a1644f754be434f)で、UITextViewにHTMLを表示することができましたが、フォントが小さかったのでフォントサイズを変更できるようにしてみました。

## CSSを追加してみた

こちらの [A Swift extension for String and HTML](https://medium.com/@valv0/a-swift-extension-for-string-and-html-8cfb7477a510) でHTMLにCSSを追加する方法が紹介されていたので、その方法を採用しました。ありがとうございます！

``` Swift
    static func parseHTML2Text(sourceText text: String, fontSize: CGFloat) -> NSAttributedString? {
        
        let htmlCSSString = "<style>" +
            "*" +
            "{" +
            "font-size: \(fontSize)pt;" +
            "font-family: Helvetica;" +
        "}</style>"
        let cssText = htmlCSSString + text
        let encodeData = cssText.data(using: String.Encoding.utf8, allowLossyConversion: true)
        let attributedOptions = [
            NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject,
            NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue as AnyObject
        ]
        
        var attributedString: NSAttributedString?
        if let encodeData = encodeData {
            do {
                attributedString = try NSAttributedString(
                    data: encodeData,
                    options: attributedOptions,
                    documentAttributes: nil
                )
            } catch {
                print("error: ", error)
                return nil
            }
        }
        
        return attributedString
    }
```

あとは、こちら↓のようにHTMLを変換するときにフォントサイズを指定して、UITextFieldのattributedTextに代入すればオッケーです。

``` Swift
    let htmlText = "<p>UITextFieldにHTMLを表示することができます。<font color=#ff0000>フォントの色</font>も変更できますし、<a href=\"https://www.apple.com/jp/\">リンク</a>も埋め込むことができます。</p>"
    let attributedString = NSAttributedString.parseHTML2Text(sourceText: htmlText, fontSize: 6.0)
    htmlTextView.attributedText = attributedString
```

文字列のなかに `"` [ダブルコーテーション]があるとエラーになります。[リンク]などでダブルコーテーションをつかうときは、 `\` [バックスラッシュ]をダブルコーテーションのまえにつけてください。

実行すると、こちらのように指定したフォントサイズで表示されます。

<img width="267" alt="スクリーンショット 2018-08-06 16.49.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/3c0ae620-db33-81db-bed1-4e74adb1f500.png">
gitからテーマのzipファイルを作って、wordpressにアップロードする

# gitからテーマのzipファイルを作って、wordpressにアップロードする

gitリポジトリから、themesを格納している特定のパスだけzipファイルにして、wordpressにアップロードできるzipを作成します。

## リポジトリの階層

```
/prj_root/wp-content/themes/example_theme
/prj_root/wp-content/themes/example_theme/index.php
/prj_root/wp-content/themes/example_theme/functions.php
などなど
```

## git archiveコマンドでzipを作る

```
git archive HEAD:wp-content/themes/example_theme/ --output=example_theme.zip
```

ブランチを指定したい場合は、「HEAD」の部分をブランチ名に変えればOK

あとは、出来上がったexample_theme.zipをwordpressにアップロードすればOK
bitubucketのAPIでmilestoneを指定する

すごいニッチですが、備忘録として。


[Bitbucket API: Filter and sort API objects](https://developer.atlassian.com/bitbucket/api/2/reference/meta/filtering)

milestoneを指定するときは、milestone名ではなく、milestoneのIDが必要。
`/2.0/repositories/main/repo/issues?q=milestone+%3D+%22MILESTONE_ID%22`

milestoneのIDは`/2.0/repositories/{username}/{repo_slug}/milestones`で取得することができる。

```:json
{
    "repository": {
        "links": {
            "self": {
                "href": "LINK"
            },
            "html": {
                "href": "LINK"
            },
            "avatar": {
                "href": "LINK"
            }
        },
        "type": "repository",
        "name": "repoName",
        "full_name": "repoName",
        "uuid": "{xxxx-xxxx-xxxx-xxxx}"
    },
    "type": "milestone",
    "name": "milestoneName",
    "links": {
        "self": {
            "href": "https://api.bitbucket.org/2.0/repositories/TEAM/REPO/milestones/264689" ←この数字列
        }
    }
}
```
ローカルファイルで Vue.js devtools を使う


少しハマったのでメモです。
Chrome の拡張機能が便利らしいので入れようとしたら、「Vue.js not detected」と言われました。

![vue-js-devtools1.png](https://qiita-image-store.s3.amazonaws.com/0/45711/df23d481-8d2b-8d80-214f-7c62a35f7cc6.png "vue-js-devtools1.png")


開発バージョンじゃなく本番バージョンを使ってるとなるよ、という情報もありましたが、開発バージョンの方使ってるし。。。

試行錯誤した結果、 Chrome の拡張機能の設定で上手くいきました。

![vue-js-devtools2.png](https://qiita-image-store.s3.amazonaws.com/0/45711/118ad2fd-4100-43b3-5f51-f41fe1575757.png "vue-js-devtools2.png")

「拡張機能を管理」を開いて。

![vue-js-devtools3.png](https://qiita-image-store.s3.amazonaws.com/0/45711/f2960e53-0318-e4d8-f38c-65a5678c8434.png "vue-js-devtools3.png")

「ファイルのURLへのアクセスを許可する」をオンにします。

めでたく、ローカルファイルでも Vueタブが表示されました。

![vue-js-devtools4.png](https://qiita-image-store.s3.amazonaws.com/0/45711/f11b0d1b-2929-14db-a26c-8b6c468e71da.png "vue-js-devtools4.png")
iOS Simulator上でネットワークの帯域制限を行う方法

# TL;DR

- 通信状況の悪い状態を再現する方法
- 通信制限のお気持ちがわかる

# ツールのインストール

今回使用するのは、Appleが提供する`Network Link Conditioner`というツールです。

この開発者用ツールは、最初からXcodeに入っているわけではありませんので、Appleの開発者サイトからダウンロードしてくる必要があります。

Xcode8以前とXcode9以降で手順が異なりますので、お使いの環境のものを参照してください。

## Xcode9以上を使っている方

`Additional Tools for Xcode`という開発者用ツール群の中に含まれているので、まずはこれをインストールします。

まずは、以下のサイトにアクセスし、`Additional Tools for Xcode`と検索して、使っているXcodeのバージョンに合うものをダウンロードしてください。

https://developer.apple.com/download/more/

<img width="1440" alt="スクリーンショット 2018-08-06 16.29.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/61960/7705cd00-a2c6-2a7d-96c1-8d919d274073.png">

ダウンロードが完了したら、ダウンロードされたdmgファイルを開き、`Hardware`->`Network Link Conditioner.prefPane`をクリックして実行してください。macOSの環境設定パネルに`Network Link Conditioner`が追加されていれば、インストール完了です。

<img width="771" alt="スクリーンショット 2018-08-06 16.37.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/61960/2e385460-0d3a-57b4-7074-780662dcc798.png">


## Xcode8以前を使っている方

Xcode8以前の場合、`Network Link Conditioner`は、`Hardware IO Tools`という開発者用ツール群の中に含まれています。

まずは、以下のサイトにアクセスし、`Hardware IO Tools`と検索して、使っているXcodeのバージョンに合うものをダウンロードしてください。

https://developer.apple.com/download/more/

<img width="1440" alt="スクリーンショット 2018-08-06 16.34.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/61960/271babe7-3d09-84e2-7790-457b2e84bb52.png">

ダウンロードが完了したら、ダウンロードされたdmgファイルを開き、`Network Link Conditioner.prefPane`をクリックして実行してください。macOSの環境設定パネルに`Network Link Conditioner`が追加されていれば、インストール完了です。

<img width="771" alt="スクリーンショット 2018-08-06 16.38.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/61960/95e85892-2eb2-e2a2-f92c-817c812921ae.png">

# 使い方

まず、環境設定パネルに追加された`Network Link Conditioner`を開きます。

<img width="670" alt="スクリーンショット 2018-08-06 16.39.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/61960/d4f2b17d-2271-5ded-d9d0-600eb69c51e9.png">

Profileで任意のプロファイルを指定し、左にあるON/OFFスイッチをクリックすれば設定が有効になります。

いろいろ項目がありますが、ざっと以下のような感じです。

|項目名|内容|
|---|---|
|Profile|プロファイルを指定します|
|DNS Delay|名前解決の際の遅延時間|
|Downlink|下り（ダウンロード）に関する設定|
|Uplink|上り（アップロード）に関する設定|
|Bandwidth|帯域幅|
|Packets Dropped|パケット損失率|
|Delay|遅延時間|

プロファイルについては、以下のものがデフォルトで用意されているので、よほどのことがない限りは自分でプロファイルを設定する必要はありません。

- 100% Loss
- 3G
- DSL
- Edge
- High Latency DNS
- Very Bad Network
- Wifi

独自にプロファイルを定義したい場合は、右下のManage Profilesをクリックします。

# 参考サイト

https://dev.classmethod.jp/smartphone/iphone/network-link-conditioner/
Raspiで突然DS18B20を認識しなくなった場合

#はじめに
Raspberry pi + 防水センサー（DS18B20）を使ってモニタリングをしていると、
どういうわけか、突然センサーを認識しなくなることがあります。今まではRapiを再起動したりしていましたが、コマンドで解決する場合がありことが分かり、メモしておきます。

#対策
GPIOのモジュールを再ロードします。このセンサーに関するモジュールは以下の2つです。

```bach
sudo modprobe w1-gpio
sudo modprobe w1-therm
```

#バッチ処理
Linux用の簡単なバッチ処理を作成しました。よろしかったら使ってください。これをcrontabで定期的に実行して生存確認を行うことができます。あくまで対症療法ですが・・・。

```bach
#!/bin/bash
#----------------------------------------
#DS18B20センサー生存確認シェルスクリプト
#----------------------------------------

acount=`cat /sys/devices/w1_bus_master1/w1_master_slave_count`
bcount=0

#command_a = "sudo modprobe w1-gpio"
#command_b = "sudo modprobe w1-therm"

if [ $acount = $bcount ]; then
   echo "ds18b2 sensor dead"
   #センサーロード
   sudo modprobe w1-gpio
   sudo modprobe w1-therm
else
   echo "ds18b2 sensor alive"
fi
```

#おわりに
長時間にわたりRaspi+センサーでモニタリングをしていると、センサーが突然暴走したり、認識しなくなる現状をこれまで経験しています。遠隔でRaspiを再起動させるには、少々リスクがあるため、最近ではまず上記の方法を行うようにしています。
CSSまとめ

#はじめに

これは**文系ボードゲーマー**である私がプログラミングを勉強したことを**アウトプット**する日記のようなもの。
今回はCSSのコードの名称と使い方まとめ

#CSS
CSSとは、HTMLの要素に対して、色、大きさ、配置などを指定してページをデザインする言語。

-　文字の色
色：color:;

- コメント：/* */

-　文字の大きさ
font-size: ?px;

- 文字の種類：フォントの種類
font-family: ??;

-　背景色
background-color: ??;

-要素の横幅、高さ
横：width: ??px;
高さ：height: ??px;

-　タグに名前をつける:クラスわけ
クラス：.selected{}

- 文字を横並びに
float: left; 左並びに

-　余白（箱の内側）
padding: ??px;

- 余白（箱の外側）
margin: ??px;

-　枠線
border: ??px;

#おわりに
前回のHTMLと今回のCSSのアウトプットを確実に自分のものにして、いつでも扱えるようにする。
Go言語のUUID生成ライブラリ

### code.google.com/p/go-uuid
github.com/pborman/uuid に移行

### github.com/pborman/uuid
uuid.New()は存在しないので、uuid.NewUUID()、V1

### github.com/google/uuid
code.google.com/p/go-uuid -> github.com/pborman/uuid -> github.com/google/uuid
uuid.New()はV4

### github.com/satori/go.uuid
uuid.New()はないので、uuid.NewV1()～uuid.NewV5()で明示的に生成


現時点では、github.com/google/uuidを使用する方針
GitHubでFork元の更新を取り込む

Github上でForkしたリポジトリをローカルにclone済みの前提です。

```
$ git remote add upstream https://github.com/XXXXXXXX/XXXXXXXX.git
$ git fetch upstream
$ git checkout 対象ローカルブランチ
$ git merge --ff upstream/対象リモートブランチ
$ git push origin 対象ローカルブランチ
```
自分用メモ的立ち位置で書く「Deep Learning 関連のチョークトークで積みあがった宿題」

# はじめに
今日、社内で @dahatake さん主催のチョークトークに参加してきました。その中で、これ自分的にちゃんと底上げしておかないとまずいなーと思ったトピックをまとめてみたいと思います。

# 参加時点の自分のバックグラウンド
参加前の状態を残しておいた方がよいかと思うので棚卸。

- 「機械学習」はある程度わかります。
    - データの加工、アルゴリズムの選択、評価などなど
    - 機械学習の成果利用といえば API 一択！そういえば最近 Windows ML がでたなーくらいのふんわり具合
- Azure Machine Learning Studio、 Service はある程度使えます
- いろいろ Azure のサービスはありますが、聞きかじりレベルのものが結構ちらほらと・・・。
    -  Azure Batch AI
    -  AKS
    -  Azure Databricks
- Cognitive Service も多少分かりますが、ちゃんと使ったことがあるのは翻訳系のAPIくらい

# では、何をこの先底上げしようと思ったのか
理由がないものは、私が対応する仕事の事情が絡んでいるのだということで。

- DSVM 使い倒し
    - この手の話って、使う「用途」がない中で使い倒しも何もないのですが、いろいろ入っている以上は、何が導入されていて、使い始めるにあたってどんなことが起きえるのかを実体験として持っておく必要があるように思いました。
    - デプロイすることがないわけではないのですが、結局「自分が慣れている」ところしか触らないので。
- データの事前分析の効率化
    - 「取り掛かりの速度を上げること」「実施のコストを下げること」が必要かなと思いました。
    - 劇的に効率よくするような銀の弾丸はないと思っていますが、それでも、都度都度スクラッチで分析を始めてしまうのはよくないなーと思っていましたので、この部分をもう少しナレッジとして整理しておく方がよいかなと。
    - 探索的にいろいろ見ていくのを否定するわけではありません。
- アンテナの広さ
    - もしかしたら、今のアンテナの向きが「対象とすること」にあってないだけかもしれませんが。今自分で見れていると思っている範囲では足りないなーと思いました。
    - 例えば、 arXiv.org は正直なところ見れてないですし。
    - Web検索だけでは中々たどり着けないことも多くなりました。
- 他社情報への興味
    - 全方位感は出せないと思ってますが、それでも。
- Open Source 活用力
    - 利用者目線で、Tutorial より上のレベル感が必要かなと思います。
    - 実力を上げるんだとすると、実案件で使ってしまうのが一番なのですが、そこはお客様のご要望もあったりしますし、なかなかうまくいかないですね。


# 気を付けておきたいと思った点
このあたりは、お客様と話していて感じていた部分もあるのですが。

- ML、DL 自体を目的としない
    - 言わずもがなですかね。手段が目的になってしまうパターンですね。
    - 徐々に減っていくとは思います。
- ML、DL は Ops 的な視点を求められている
    - 機械的な仕組みは作れるのですが、単なる自動化を超えたものが必要ではないかと思います。

# おわりに
本当にザーッと書いただけなので、チラシの裏と思っていただければと。
Rのパッケージ"clusterSim"をインストールする

## CentOS7でclusterSimをインストールするとエラーになった

`configure: error: X11 not found but required` とあったのでX11の問題かと調べていたが、原因はそこではなかったのでメモ。


```
> install.packages("clusterSim", dependencies = TRUE)
configure: libpng header and lib found
configure: using libpng dynamic linkage
checking for X... no
configure: error: X11 not found but required, configure aborted.
ERROR: configuration failed for package ‘rgl’
* removing ‘/home/hoge/tools/rgl’
ERROR: dependency ‘rgl’ is not available for package ‘clusterSim’
* removing ‘/home/hoge/tools/clusterSim’

 ダウンロードされたパッケージは、以下にあります 
 	‘/tmp/RtmpTVA0nz/downloaded_packages’ 
 警告メッセージ: 
1:  install.packages("clusterSim", dependencies = TRUE, lib = "/home/hoge/tools") で: 
   パッケージ ‘rgl’ のインストールは、ゼロでない終了値をもちました 
2:  install.packages("clusterSim", dependencies = TRUE, lib = "/home/hoge/tools") で: 
   パッケージ ‘clusterSim’ のインストールは、ゼロでない終了値をもちました
```

`libpng-devel` （PNG 画像処理プログラムのための開発ツール）が原因。
インストールしてみる。

```
$ sudo yum install libpng-devel.x86_64
Running transaction
  インストール中          : 2:libpng-devel-1.5.13-7.el7_2.x86_64      1/1 
  検証中                 : 2:libpng-devel-1.5.13-7.el7_2.x86_64      1/1 

インストール:
  libpng-devel.x86_64 2:1.5.13-7.el7_2    

完了しました!
```

再度、パッケージをインストールしてみると、できた。

```
$R
> install.packages("clusterSim", dependencies = TRUE)
 パッケージを ‘/usr/lib64/R/library’ 中にインストールします 
 (‘lib’ が指定されていないため) 
 install.packages("clusterSim", dependencies = TRUE) で警告がありました: 
   'lib = "/usr/lib64/R/library"' は書き込み可能ではありません 
Would you like to use a personal library instead? (yes/No/cancel) yes
Would you like to create a personal library
‘~/R/x86_64-redhat-linux-gnu-library/3.5’
to install packages into? (yes/No/cancel) yes
 依存対象 (dependency) ‘rgl’ もインストールします 

 > library(clusterSim)
 要求されたパッケージ cluster をロード中です 
 要求されたパッケージ MASS をロード中です 

This is package 'modeest' written by P. PONCET.
For a complete list of functions, use 'library(help = "modeest")' or 'help.start()'.
```
MarketoのREST APIを使ってログ連携

#概要
マーケティングオートメーションツールとして有名な「[Marketo](https://jp.marketo.com/)」だが、[REST API](http://developers.marketo.com/rest-api/)を通じて他システムのログを取り込むことも出来る。というわけで、Qiitaは初投稿兼ねてログ連携のプログラムを作ってみた。
#出来上がったもの
https://github.com/asaborake/marketobulkimport
使い方はREADMEを参照
#ひっかかった点
Marketoが公式にサンプルプログラムを幾つか公開している。
https://github.com/Marketo/REST-Sample-Code
基本はこれとリファレンスを参考にして実装すれば問題なく作れる。以下は実際に作ってみて引っかかった点。
##エンドポイントを間違える
http://developers.marketo.com/rest-api/base-url/
を読むと

>Base URL:  https://284-RPR-133.mktorest.com/rest
>Path:  /v1/lead/
>Resource:  318582.json
>Query parameter:  fields=email,firstName,lastName

と書いてある。で、実際にやりたかったのは[Bulk Lead Import](http://developers.marketo.com/rest-api/bulk-import/bulk-lead-import/)だったので見てみると

```
POST  /bulk/v1/leads.json?format=csv
```

とある。というわけで、Base URLにRequestのパスをそのままつなげたら見事にエラー。Base URLはあくまで.com手前まで、第1階層以降は用途によって変わる。

##Failログのレスポンスがcsvで返ってくる
APIのレスポンスは基本jsonなのだが、Failログのレスポンスだけは何故かデフォルトがcsv。formatパラメータ指定が出来るようだが、何気にひっかかってしまった。
http://developers.marketo.com/rest-api/bulk-import/bulk-lead-import/#failures
#まとめ
内容云々ではなくまずは初投稿ということで。皆様のご意見諸々賜れたら幸いです。
ActiveSerializerを利用して、Json化する際に子オブジェクトにsortをかける方法

Json化する際に、has_manyで保持しているオブジェクトを並び替えて表示したいことはままあります。

そういう場合に使える、ちょっとした方法をご紹介

##事例
注文に対して、複数の注文詳細があり、商品コードによって並び替えて表示したいケース

##サンプルコード

```*.rb
class OrderSerializer < ActiveModel::Serializer
  has_many :order_details

  # 表示順を担保するためにオーバーライド
  def order_details
    object.order_details.sort_by(:product_code)
  end
end
```

##結論
Ruby便利
似た名前の変数を使うよりも辞書機能を使おう

私はPythonの辞書機能を最近まで使いこなせていませんでした．

例えば0,1,2回目でseedの値を変えようとする時，
これまでは以下のように作っていました．

``` 
seed0 = 0
seed1 = 1
seed2 = 2
```

変数の数がどんどん増えるとややこしくなるので，
こうした場合に辞書機能を使うと分かりやすくなると思います．

# 辞書を使おう

辞書を使うと，以下のように`seeds`という1つの辞書変数にまとめることが出来ます．

```
In:
seeds = dict()
for i in range(3):
    seeds[i] = i 
print(seeds)
```

```
Out:
{0: 0, 1: 1, 2: 2}
```

これは以下のように簡単に書けます．

```
{i: i for i in range(3)}
```

「seed1とかseed2などの名前が欲しいなぁ」という場合は，
Keyを活用すればより要求に近い形になるでしょう．

```
In:
seeds = {}
for i in range(3):
    seeds['seed%0d' % i] = i
for key, value in sorted(seeds.items()):
    print(key, value)
```

```
Out:
seed0 0
seed1 1
seed2 2
```

### 注意：local()を使う

local()を使ってローカル変数にアクセスすることは可能ですが危険です．

```
for i in range(3):
    locals()['seed{0}'.format(i)] = i
```

# 既にある似た名前の変数をリストにまとめたい時

test1,test2，test3という別々の変数があったとします．
(そもそも辞書を作って１つの変数にしとけよ･･･というツッコミは今は考えないことにします)
やりたい事は，

``` 
test0 = 0
test1 = 1
test2 = 2
```
から，`tests = [0,1,2]`を作ることです．

### 解決策

eval()を使います．

```
tests = [eval("test%d" % (i)) for i in range(3)] 
print(tests)
#tests = [0,1,2]
```
但し，eval()を使うことは好ましくありません．
理由がはっきりと分かっていませんが，eval()はlocal()探しに行くが，他で同じ名前のtest1があった時に混乱してしまうから，と理解しています．
やはり，もともと辞書を最初に作っておく事が大切なんですね．

## 追記

shiracamusさん，Sh1maさんからコメントを頂き，一部更新しました．
Windows10で、管理者なのに削除できないフォルダを削除する

# 注意
管理権限がないので削除できないという場合にはそもそもそれは消せないので、消せないです。本稿は管理者なのに削除できないファイルがあってストレスで胃がキリキリ言っている人向けの記事です。

この記事に書かれている方法は、本来Windowsの一般的なユーザーがやるべきではない作業が盛り込まれています。「消すな」って設定されてるファイルをわざわざ削除する作業なので、「確実に要らないし、本気で邪魔だから上司より邪魔だからマジで消したい。消してスッキリしたい。じゃなきゃストレス死しちゃう」と言う場合を除いて絶対にやらないでください。また不可逆な操作なので本当によく確認しながら、なんなら復元ポイントをちゃんと用意してから作業するのが良いと思います。
なお私は「一応置いてたけどウィルススキャン長くなるだけから消すわ」って動機で消しました。

# 経緯
PCを新調しました。
Cドライブに新しいWindows環境を作成し、古いPCのHDDは容量余ってたし、中身の掃除もしないでまるごと(物理的に)引っ越してDドライブとして使うことにしました。
Dドライブには使いもしない「Program Files」フォルダと「Windows」フォルダが残りました。
使わないので削除しようとしたら「フォルダーアクセスの拒否」が表示され、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176146/8b0370ee-76e6-b22e-4bd6-3e08178d5e30.png)
「続行」をしたら「TrustedInstallerからアクセス許可を得る必要があります」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176146/053426a6-2865-5e22-c2fc-7bd742204955.png)
のコンボで削除することができません。私は管理者なのに。
消したい。

# 原因
ファイルの所有者がTrustedInstallerやsystemになっており、安易に削除はできないようになっています。アクセス権も与えられていません。ただ、もちろん管理者はこの所有者を変更することもできるしアクセス権も変更できます。

# GUIを利用する手順
ひとつひとつやるのはとてもめんどくさいですが、右クリックからセキュリティの詳細設定入って所有者を変更した後でアクセス権を変更すれば削除できるようになります。ただ今回のようにProgram Files以下全部とかやるのはとても大変なのでコマンドプロンプトからまとめて作業します。
この手順は以下の記事が参考になります。
[Administratorでも変更できない権限"TrustedInstaller"](https://qiita.com/shojit/items/f863ef3f56057a7e36d6)

# cmdを利用する手順
この手順は以下の記事が参考になります。
[Windows で強制的にディレクトリを削除する](https://qiita.com/mizutoki79/items/58d236f85b76cb7f61d8)
本稿で紹介する手順は本質的にはこちらの手順と同じです。ただ、本稿ではもうすこし初心者向けに、ビクビクしながら「D:\Program Files」の例で書きますので読者は自身のレベルに合わせて参考にする記事を選択するのが良いかと思います。

## コマンドプロンプトを管理者権限で開く
WindowsのスタートメニューからWindowsシステムツールのコマンドプロンプトを右クリックして管理者で開きます。
## 削除したいフォルダへ移動する
基本ですけど一応ちゃんと書きます。ちゃんとカレントディレクトリが移動したことを確認してください。

```
> d:
> cd "Program Files"
```

## 所有者を変更する(所有権を得る)
所有者の変更は`takeown`コマンドを使います。このコマンドを実行するとプロンプトに作業経過が滝のように流れてきます。完了までには数分かかるかもしれません。

```
> takeown /F * /R /A
```
>/F * : このディレクトリ以下のファイル全てを選択します
>/R : サブディレクトリまで全部やります
>/A : 所有者をAdministratorsにします。

/Aを書かなければ所有者はログインユーザーになります。ログインユーザーになればそれで削除できますけど怖いので今回はAdministratorsみんなを所有者にしました。


場合によってこんな確認が出る場合もあるかと思いますが、yで良いと思います。
![1533535931.png](https://qiita-image-store.s3.amazonaws.com/0/176146/40b4ac89-4705-5960-fabf-31793c0408f3.png)


## アクセス権を変更する(削除する権限を得る)
アクセス権の変更は`icacls`コマンドを使います。このコマンドを実行するとプロンプトに作業経過が滝のように流れてきます。完了までには数分かかるかもしれません。所有者変更よりは短い時間だと思います。

```
> icacls * /T /grant Administrators:F
```
>/T : サブディレクトリまで全部やります
>/grant Administrators:F : Administratorsに対してフルコントロールを許可します

## 削除する
以上の操作でファイルを削除できるようになりました。
あとはエクスプローラーから全部選択して削除すればいくつか管理権限が必要なファイル削除していいのかとかシステムファイルだけど本当に消していいかとか聞かれますけど削除してあげればよいかと思います。

# 終わりに
上述もしましたがこの記事を書くにあたりQiita内を軽く検索し、以下の類似情報を得ました。参考にもさせていただきました。ありがとうございます。
[Administratorでも変更できない権限"TrustedInstaller"](https://qiita.com/shojit/items/f863ef3f56057a7e36d6)
[Windows で強制的にディレクトリを削除する](https://qiita.com/mizutoki79/items/58d236f85b76cb7f61d8)

むかしのひとはいいました。注意一秒、怪我一生。ファイルの削除は十分に注意して、本当に消していいのかよく検討の上、えらいひとの許可を得て最悪何かあってもスケジュールに影響のないタイミングで作業してください。
Raspberry pi、ArduinoでDO（溶存酸素）測定をやってみる

#はじめに
これまで、温度センサー（BME280）、水温センサー（DS18B20）などを、Raspberry piやArduinoなどと繋いでモニタリングしてきましたが、水質測定ができないものかと探しておりました。やはり、あるではないですか、Atlas Scientific　https://www.atlas-scientific.com/
しかも、Arduinoのコード付きとはありがたい。早速試してみました。

#Arduino Unoとの接続方法
なにはともあれ、まずは接続方法。Arduino Unoとの接続方法は、Atlas Scientificのホームページを参考にしました。使用するのはSDL、SCL、GND、5Vの4つのピンだけ。
![KIMG0948.JPG](https://qiita-image-store.s3.amazonaws.com/0/278731/1702ee63-b903-225b-27ee-6058409f4dc0.jpeg)

#コード
サンプルコードは、Atlas Scientificから提供されていますが、このような内容になっています。


```C
SoftwareSerial myserial(rx, tx); 

String inputstring = ""; 
String sensorstring = ""; 
boolean input_string_complete = false;
boolean sensor_string_complete = false;
float DO;

void setup() { 
  Serial.begin(9600); 
  myserial.begin(9600);  
  inputstring.reserve(10); 
  sensorstring.reserve(30);  
}


void serialEvent() {   
  inputstring = Serial.readStringUntil(13); 
  input_string_complete = true; 
}


void loop() {  

  if (input_string_complete){ 
    myserial.print(inputstring); 
    myserial.print('\r'); 
    inputstring = ""; 
    input_string_complete = false;
  }

  if (myserial.available() > 0) {
    char inchar = (char)myserial.read();
    sensorstring += inchar;
    if (inchar == '\r') { 
      sensor_string_complete = true; 
    }
  }

  if (sensor_string_complete== true) {
    Serial.println(sensorstring); 
    /*   
    if (isdigit(sensorstring[0])) {
      DO = sensorstring.toFloat(); 
      if (DO >= 6.0) {      
        Serial.println("high"); 
      }
      if (DO <= 5.99) { 
        Serial.println("low");
      }
    }
    */
    sensorstring = "";   
    sensor_string_complete = false;  
  }
}
```

#プログラム実行
さてさて、接続完了し、Arduinoスケッチから上記のプログラムをコンパイル後、ボードへ書き込ます。あとは、シリアルモニタを開くと、DOの値が返ってきます。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/278731/4c7349f9-3157-b68c-5b17-c939ac1365ef.jpeg)

#数字の妥当性
出力されている値が適切かどうか、いちおう押さえておく必要がありますね。わたしは、以下のサイトを参考にしました。これによると水温29℃では7.64mg/Lとなっています。だいたい近い値か・・・これでよしとしよう。
■飽和溶存酸素量
蒸留水、一気圧下における各温度の飽和溶存酸素の表
https://www.rex-rental.jp/knowledge/sui/sui_007.html

#Raspberry piとの接続
今度はRaspiとの接続をやってみます。Arduinoとの連携は、わりとすんなりいきましたが、Raspiとはどうでしょう。これが、Atlas ScientificのサイトにはRaspiとの接続方法やサンプルコードが見当たらない・・・。しかたないので、このあたりのサイトを参考にしました。
https://raspberrypi.stackexchange.com/questions/56026/i2c-device-not-detected-by-raspberry-pi
基本的にはArduinoとほぼいっしょのようです。

#おわりに
次の課題は、温度センサー（BME280）、水温センサー（DS18B20）などのセンサーと、DO計を同時に繋げる方法にチャレンジしてみます。次の記事に投稿します。
pip upgrade error on OSX

````

$ pip install --upgrade pip

Could not fetch URL https://pypi.python.org/simple/pip/: There was a problem confirming the ssl certificate: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:645) - skipping
Requirement already up-to-date: pip in /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages

````

````
$ pip --version

pip 9.0.1 from /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages (python 3.5)
````


Upgrade pip using.

````
curl https://bootstrap.pypa.io/get-pip.py | python3
````
````
pip --version
pip 18.0 from /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pip (python 3.5)
````
IntelliJ IDEA で矩形選択する方法

忘れたり聞かれたりするときのためにメモしておく。
以下は Mac 版 Intellij IDEA での利用を想定

1. Option + マウスドラッグ
2. Cmd + Shift + 8 で改行を無視してカーソル移動できるようにした後で必要な箇所を選択
3. Option + Option + カーソルキー or マウスドラッグ（2 回目の Option は押しっぱなし）

3 は教えてもらった。
個人的には、キーボード操作に閉じられるため、3 をよく使うが、状況によっては、2 も使う。
キーボード操作メインの作業をしているときにマウスはあまり使いたくないので、1 は基本的に使わない
scpでファイル/フォルダの転送

#やりたいこと
scpでファイルやフォルダの転送

`scp` は `ssh` + `cp` らしい

##sshconfig

```
Host [ホスト名]
  HostName     [IP]
  Port          22
  User         [ユーザー名]
  IdentityFile [キーペアのパス]
```

## 送る

```
scp -r [送りたいファイルorフォルダのパス] [ホスト名]:[持っていきたいとこのパス]
```

## 持ってくる

```
scp -r [ホスト名]:[持ってきたいファイルorフォルダのパス] [持ってきたい場所のパス]
```

## 備考

`-r` でフォルダもコピーできる。

権限がある場所やファイルしかコピーできない。
Java,二次元配列について

# はじめに

Javaの二次元配列について理解を深めたいと思い、まとめました。

##サンプルコード

二次元配列とは、２つのインデックスで要素を指定する配列のことです。

```java:Main.java

public class Main {
    public static void main(String[] args) throws Exception {
        
        //配列の作成方法 - ⑴ ※ 解説
        
        //String[][] teams;
        
        //teams = new String[2][3];
        
        //配列変数の宣言
        //new演算子で要素数を指定し、teams へ代入
        
        //配列の作成方法 - ⑵
      
        //String[][] teams = new String[2][3];
        
        //⑴の方法を　同時に行う

        //teams[0][0] = "勇者";
        //teams[0][1] = "戦士";
        //teams[0][2] = "魔法使い";
        //teams[1][0] = "盗賊";
        //teams[1][1] = "忍者";
        //teams[1][2] = "商人";
        
        //配列へ格納
        
        //配列の作成方法 - ⑶
        String[][] teams = {{"勇者", "戦士", "魔法使い"}, 
                            {"盗賊", "忍者", "商人"}};
        
        //作成から格納まで同時に行う

        System.out.println(teams[0][0]);
        //実行結果　:勇者
       
        teams[0][0] = "剣士";
        // 勇者　→　剣士 に更新
        
        System.out.println(teams[0][0]);
        //実行結果:剣士


        System.out.println(teams.length);
        //実行結果:2
        //配列の長さ

        System.out.println(teams[0].length);
        //実行結果:3
        //teams[0]の配列の長さ
    }
}
```

## 解説


```java:Main.java
teams = new String[n][m];

// n:配列の要素数 , m:要素に格納された配列の要素数
```
座標で言うなら y座標はn, x座標はmとなる。
参考までに[ここを](http://ysklog.net/java/5-18.html)クリック！
良い提案書を書く方法（システム開発）

#はじめに
エンジニアであろうと、「提案書作成」をする（させられる）ことがあります。
この「提案書作成」がうまくできるかどうかは、直に受注に繋がるわけで、一つのプログラミング言語を習得し実装できること以上に大切だったりします。
「提案書作成」はエンジニアにとっても一つのスキルなわけです。

#提案書を書くのは難しいのか？
提案書を書くのは、はっきり言って難しいです。
なぜならば、世の中には「提案書の上手な書き方」と題した**フレーム**はたくさんあるものの、具体性が伴っていないからです。

この**フレーム**ってやつは、ほぼ間違いなく下記です。
1.御社の課題は◯◯と××と△△です
2.これらを整理すると「こう」なります
3.これらの解決策は「こう」です
4.それぞれのメリット・デメリットはこうです
5.よって「これ」がいいです

これを書けと上からも言われます。
（口で言うのは超簡単です）

#提案書を書くのはなぜ難しいのか①
先方から◯◯したいと聞けば、ある程度の経験があれば即座にこうすると良いといったことが思いつきます。
この判断は自社の実績や経験に寄るところが大きく、実績や経験があるほどぱっと提示できます。
そのため、提案書は「答えは〇〇です」といった結論ありきになります。

言い方を変えると、提案書（**フレーム**）はボトムアップ的であるにも関わらず、頭の中はトップダウン的になってしまっているわけです。
なので、必ず顧客とのギャップを生みます。

さらに言い換えると、本来は課題を細かく分析して結論をだすべきなのに、外部的要因（自社のリソース等々）から結論の押し付けになってしまうわけです。

#提案書を書くのはなぜ難しいのか②
人間には感情があります。感情に伴ってありとあらゆるものに対してバイアスをかけてしまいます。
当たり前のように提案内容がまったく同じであっても、キレイな提案書と雑多な提案書があれば、キレイな提案書を書いた方を選択することでしょう。
このありとあらゆるものに対してかかるバイアスをコントロールするのが人間だからこそ難しいわけです。

今までの経験上、これはこうやって解決できるとぱっとわかってしまうが故に、現状の分析ができずに、提案が押し付けになってしまいます。

顧客が本当に求めていることは、ボトムアップ的な現状の課題解決にも関わらず、トップダウン的な課題解決になってしまいます。

#どうすればいいのか
解決策をぱっと出さないことが大切です。（そして、解決策をぱっと出せるオレかっこいいと思わないこと）
フレームは決まっているので、このフレームに沿って分析を行うことが必要です。

具体的にやるべきことは下記になります。
1.現状の課題をインプットする
2.課題を整理する
3.解決案を複数出す
4.解決案のメリット・デメリットを考える

普通は、3の解決案を出す上で、１が甘かったり、2がイケてなっかったりし、一回キレイにまとめたものをやり直すといった**面倒なこと**をやる必要があります。（ここにも「せっかく頑張ったのに」バイアスがかかります）

提案書はありとあらゆる外部要因が重なって、ありとあらゆるバイアスを生じるが故に難しいわけです。

#最後に
このように考えると、エンジニアがあまりもっていないスキルである、「パワポ作成能力」と「ビジネス的な人脈」をたくさん持っているコンサルさんの必要性がわかります。
彼らは、システムを実装する能力がないが故にトップダウン的な解決策の提示にならず、ボトムアップ的な顧客の要望に沿った提案書が書けるわけです。

#最後の最後に
両方できた方がいいに決まっているので、世の中のエンジニアの皆さん、がんばりましょう!!!

#参考
『ギリギリまで「まとめに入らない」能力』 by ちきりん
http://d.hatena.ne.jp/Chikirin/20111124
FGOなど大規模ゲームの課題から学ぶゲームサーバ・インフラ勉強会 メモ

# FGOなど大規模ゲームの課題から学ぶゲームサーバ・インフラ勉強会
https://connpass.com/event/91736/
Twitterハッシュタグ：\#ゲームサーバ勉強会

## アカツキ：大規模環境におけるRuby on Rails on AWSでの最適化事例

### 大規模キャンペーンによるリスエスト数増加
* アクセス数が想定以上
* DBのスケールアップを限界まで行ったが対応できず

### モバイルゲームのインフラ的問題点
* モバイルゲームはユーザーが何かする度にサーバへアクセスするため、アクセス数が膨大
* イベント等でアクセススパイクが発生しやすい
* ユーザーデータが膨大
  * キャラ数、育成状況、イベントのクリア状況など（処理も複雑になる）
* Write Intensive
  * アイテムの取得など、書き込みが多くcacheし辛い

### インフラ構成
* User
|
* Load Balancer
|
* EC2（c4.8xlarge）Auto Scaling * 数十台
|
* ゲームデータ：RDS（Aurora）r4.8xlarge * 数台
* ユーザー：RDS（MySQL）r4.4xlarge * 数十台
* セッションとレスポンスキャッシュ：Memchached m4.2xlarge
* ランキングや永続化したいデータ：Redis r3.xlarge 混在 数十台

### Resharding
既存のインスタンスをコピーして作成。
別DBに同一レコードが存在。
更新可能なSlaveを作成し、重複レコードを別EC2から削除。
削除が完了したらSlaveをMasterに昇格。

## ディライトワークス：これで怖くない！？大規模環境で体験するDB負荷対策 〜垂直から水平の彼方へ〜

### なぜ今垂直分割から水平分割なのか？
#### 2016年5月、1台だったDBを分割
データの肥大化により、DBのインデックスがメモリに乗らなくなった
検討時間が十分に無く、垂直分割で対応

#### 2018年1月、テーブルの肥大化により参照クエリのレイテンシが増大
##### 当時の環境
* MySQL（5.6）
  * db.r4.16xlarge 18台 （Master6台、Slave12台）
* Redis（2.8）
  * cache.r3.4xlarge 2台
* memccached
  * cache.r32xlarge

#### 垂直・水平分割の移行課題
##### 何をキーとして分割するか
ユーザーIDをキーとする。
更新を1つのトランザクションで行いデータ不整合を防ぐ。

##### 何分割か
20分割。
これまでのデータ量の増加などから今後分割をしなくて良い数を計算した。

##### どう移行するか
AWS DMSを利用する。
https://aws.amazon.com/jp/dms/
移行中でもソースDBを利用可能。
Aurora間でも移行可能。

##### ダウンタイムをどうするか
AWS DMSを利用するため、DB切替の数時間のみ。

##### 切り戻しをどうするか
ダブルライト方式を採用。
AWS DMSでリカバリ環境を準備する。

#### 移行
##### どのように移行したか
MasterCluster → SlaveCluster → AWS DMS → 移行後のDB → AWS DMS → リカバリ環境

##### 移行プロセス
2018年7月のFGO3周年を耐えることをターゲットに。
全期間は2018年3月～7月。

##### AWS DMSによる移行方法の確立
全テーブルを精査し再設計した。
AWS DMSのタスク機能を以下の様に使用する。
1. 既存データの全ロード
2. キャッシュされた変更の適用
3. 継続的なレプリケーション

##### AWS DMSを利用するには
レプリケーションサーバを作成。
データのソースエンドポイントとターゲットのエンドポイントを設定。
移行用のタスクを作成。
Indexを定義せず、移行先DBへスキーマを流す。
フルロードし、Indexを作成。
CDC（Change Data Capture）レプリケーション。

最初にスキーマだけを流しておくと、AWS DMSが全て移行してくれる。
また、Indexを先に作成してしまうと時間がかかる。

DMSのタスクによる移行では、
ソースエンドで関数をサポートしていない。
20分割用のカラムを追加する。

FastDDL（lab mode）でカラムを追加した。
本番環境での使用は推奨されておらず、十分な検証を実施。
メンテナンス時に追加を実施。

##### 負荷試験
本番環境同様の環境を準備。
APIを準備。
負荷試験ツールで本番同様のシナリオを実施。
詳細はLT。
https://medium.com/shiguredo/fgo-%E3%81%AB%E6%8E%A1%E7%94%A8%E3%81%95%E3%82%8C%E3%81%9F%E8%B2%A0%E8%8D%B7%E8%A9%A6%E9%A8%93%E3%83%84%E3%83%BC%E3%83%AB-2fa3de337e20
DB分割による効果測定も実施。

##### リハーサル
Binlogスレッドが複数起動し、Mutexの奪い合いが発生。
これによりレプリケーションが遅延。
負荷をかけない環境で、Binlogスレッドを長めにすることで解決。

フィルタを利用するとソース・ターゲットの整合性がとれないので断念。

mysqldbcompareで比較するも高負荷のため、行数・スキーマの比較にのみ利用。
※ mysqldbcompare：定義以外にも件数や内容も確認可能
その他はCHECKSUM TABLEを利用。

移行後の障害テストもクリア。

##### 移行本番

夜間計画メンテナンスを実施。
1. AWS DMS移行
2. ダブルライトに切替
3. 後日データ整合性チェック
4. ダブルライト停止

3実施時、リカバリ環境でデータ不整合が見つかった。
移行後のDBとリカバリ環境とのwait_timeoutが60秒と短かったことが原因。
28800秒にして再度リカバリ環境にデータ移行し問題なし。
整合性チェック完了。
Nuxt×vuexfireでちょっとハマった

# やりたかったこと

- Nuxtで
- storeをモジュールモードで
- namespaceを利用して
- vuexfireを使う

# ハマったところ

store/index.jsにvuexfire関連の設定をしているサンプルはたくさんあったが、namespaceを利用してindex.js以外のファイルを使おうとした場合に、

```
[vuex] unknown mutation type: VUEXFIRE_ARRAY_INITIALIZE
[vuex] unknown mutation type: vuexfire/ARRAY_ADD
```

が出てしまった。

その時の設定例は以下の通り。(index.jsならうまく行くが、それ以外だと↑のエラーで怒られる)

```javascript:store/index.js/other.js
import firebase from '@/plugins/firebase'
import { firebaseMutations, firebaseAction } from 'vuexfire'

const db = firebase.database()
const itemsRef = db.ref('items')

export const state = () => ({
  items: []
})

export const mutations = {
  ...firebaseMutations
}

export const getters = {
  items: state => {
    return state.items
  }
}

export const actions = {
  init: firebaseAction(({ bindFirebaseRef }) => {
    bindFirebaseRef('items', itemsRef)
  })
}
```

# 解決策

ちゃんとREAMDEに記載されていた。。。

https://github.com/posva/vuexfire

![スクリーンショット 2018-08-06 14.51.52.png](https://qiita-image-store.s3.amazonaws.com/0/173370/43040cef-9a25-ace6-e4da-ae2d49afadc6.png)

mutationsはrootに作れよ、と。

ということでmutaionsのみindex.jsへ。

```javascript:store/index.js
import { firebaseMutations } from 'vuexfire'

export const mutations = {
  ...firebaseMutations
}
```

```javascript:store/other.js
import firebase from '@/plugins/firebase'
import {firebaseAction } from 'vuexfire'

const db = firebase.database()
const itemsRef = db.ref('items')

export const state = () => ({
  items: []
})

export const getters = {
  items: state => {
    return state.items
  }
}

export const actions = {
  init: firebaseAction(({ bindFirebaseRef }) => {
    bindFirebaseRef('items', itemsRef)
  })
}
```

これでエラーが解消され、やりたかったことがやれるようになった。

# サンプル

[こちら](https://github.com/TsukasaGR/nuxt-vuexfire-sample)

# 教訓

ドキュメントを読め。
読んだつもりじゃなくて読め。
Microsoft Azure - Congnitive Services - Face API を使うといくらかかるか計算したメモ

参考
https://azure.microsoft.com/ja-jp/pricing/calculator/?service=cognitive-services

(2018/9/24現在、WindowsのChromeで動作しません。Edgeなら動きます orz）

１ヶ月＝３０日とします。

1秒に１回のトランザクション
 60[sec] x 60[min] x 24[hour] x 30[day] = 2,592,000[トランザクション]　 ... 254,643円

5秒に１回のトランザクション
 60[sec] x 60[min] x 24[hour] x 30[day] ÷ 5 = 518,400[トランザクション]　 ... 58,128円

60秒に１回のトランザクション
 60[sec] x 60[min] x 24[hour] x 30[day] ÷ 60 = 43,200[トランザクション]　 ... 4,928円
テーブルカラム追加で、データを簡単に加工しつつ追加したい

こんなテーブルが既にあって、

|id|file_path|
|:-:|:-:|
|1|reports/48/1531826234/output.pdf|
|2|reports/48/1531826588/output.pdf|

ここで dir_prefix というカラムがやはり欲しくなったので not NULL で追加したい。
かつ中身は file_path から引っ張ってきたい。
という時の migration の書き方を考えた。

1. null: false のカラムは NULL の状態では作れないよ(それはそう)
2. default: 0 とかもやりたくない
3. 既存のレコードには、別カラムのデータを超簡単に加工して突っ込みたい。
 rake にコンバート処理を書いて後から流してもいいけれども、リリース後の手作業を減らしたいし、正しいデータが入るまでに時間差が発生する

ということで、postgresql の文字列関数を使った。

```rb
class AddDirPrefixToReports < ActiveRecord::Migration
  add_column    :reports, :dir_prefix, :string
  change_column :reports, :dir_prefix, "VARCHAR USING split_part( CAST(file_name as VARCHAR), '/', 3 )"
  change_column :reports, :dir_prefix, :string, null: false
end
```

実行するとデータが入った状態で not NULL のカラム追加ができている。

|id|file_path|dir_prefix|
|:-:|:-:|:-:|
|1|reports/48/1531826234/output.pdf|1531826234|
|2|reports/48/1531826588/output.pdf|1531826588|

基本的には migration にはデータのコンバートを含めない派ですが、
例外としてこの程度であればメリットが大きいと感じます。
enum の case name に none, some を使う前に

独自で定義したenumに`none`や`some`を使うと条件判定文で　Optional型と競合しちゃうので気をつけましょうという話。

# 起こってしまったこと
`case none`のあるenumを定義をしてしまったため
独自enumの`none`を判別し、処理したかったのに、
Optionalの`none`と判別するようなコードになってしまいました。

```swift
enum Meal {
case none    // 記録なし
case logged  // 記録済み 
case skipped // 食べなかった
}

var meal: Meal? = Meal.none

if meal == .none {
//　ここはOptionalの`none`の時に処理される
}

```

# 解決案
@t-ea さんからのコメントより、以下のように書くときちんとOptionalを判別できます。
これから書くコードではこの条件式を利用すると、明確になっていいですね。

```swift
if meal == .some(.none) {
// ...
}
```

しかしながら、既存のcase nameをリファクタリング機能を使って変更すると既存のコードの意味合いが変わってしまう場合があるので、
`none`や`some`が使いたくなった場合は、違う名前をつけることも検討して見ましょう。

| some | none |
| --- | --- |
| done | yet |
| complete | incomplete |
| logged | noLog |
| full | empty |
| filled | blank |
Watson Studioで自動運転に必要な画像処理技術を学ぶ（１）

# はじめに
車の自動運転では周囲の状況をリアルタイムに把握し、状況に応じた車の制御を行う必要があります。画像処理技術は自動運転に必要な重要な要素技術になりますが、本記事では複数回に渡り、自動運転に必要な画像処理技術を Watson Studio で学習してみようと思います。学習にあたっては以下リンク先を参考にしています。

https://github.com/aruizga7/Self-Driving-Car-in-DSX

# 道路のレーン検出
今回は道路のレーンの検出を行います。白線や黄色線でレーンが描いてある場合にこれを画像処理で検出します。今回は OpenCV を使用して、白線の認識してみます。

# 手順
Watson Studioでプロジェクトを作成して、以下リンク先から Notebook を作成します。
https://github.com/schiyoda/Self-Driving-Car/blob/master/1.Line-Lane-Detection.ipynb

Notebookでは高速道路を走行中の動画の各フレームに対し、白黒変換->ハフ変換をして道路上の白線を直線として検出しています。Notebookを順に実行すると、以下のようにNotebook上で検出結果を見ることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/c2330ddc-94e1-2ab3-8529-ce126520a63c.png)

![line-lane-detection.gif](https://qiita-image-store.s3.amazonaws.com/0/235649/0c6186e4-c67d-f041-5d0c-c79bb7de2fd6.gif)

動画は以下リンクで参照可能です。
https://raw.githubusercontent.com/schiyoda/Self-Driving-Car/master/line-lane-detection.mp4
【備忘録】Windows を NTP Server として使う

# 備忘録
WindowsをNTPサーバとして動作させる必要が有ったので、備忘録として記録する。

## 使用するOS
Windows 10 HOME

# レジストリ
Windows を NTPサーバとして動作させるには レジストリの設定変更が必要。

## regedit
「ファイル名を指定して実行」を選択し「regedit」と入力、「OK」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214132/f083b548-0a9d-4c4e-f28b-146ead7295f3.png)

## NTP Server Enable
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServerを選択し、
[Enabled]の項目を１へ変更し"OK"をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214132/01574bf0-27a1-2977-d7a6-6538422447fc.png)

## W32Time
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config] の [AnnounceFlags] を開き "5"へ変更しOKをクリック
※なぜ"5"なのかは不明....


![image.png](https://qiita-image-store.s3.amazonaws.com/0/214132/480b3b38-8417-a053-3f05-8c83b5267b6a.png)

## regedit閉じる
設定は以上で完了。

## NTPサーバ　起動
* ”コマンドプロンプト（管理者）”を開く
* net stop w32time と入力しEnter
* NTPサーバが起動していない場合は以下のような表示となる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214132/1fb42004-b4b7-28ea-b96a-206566b38c46.png)

* net start w32time と入力しEnter
* NTP サーバが起動する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214132/8a9e3ba8-e1a7-2a43-c807-4c111d5fd32f.png)

これで正常にWindows上にて NTP サーバが起動。
他の端末からサーバが起動している端末へNTP接続を行えば時計同期が行える。
セキュリティソフトなどを使用している場合は必要に応じてルール変更が必要。
mac の openコマンドで Parallel Desktopのアプリを開こうとしてくる。でも、もうアンインストールしてる。

openコマンドを使うと、terminalからFinderが簡単にひらけて便利です。

```sh
open . #=> カレントディレクトリをfinderで開いてくれる
```

openコマンドにURLを渡すとブラウザで開いてくれるようですが、僕の環境だと「Parallel Desktopがインストールされてないよ」ってエラーが出て何もできません。Parallel Desktopはアンインストールしてるから、当然ありません。

このせいで、ReactNativeのremote debugでうまくブラウザを開いてくれない問題も起こります:rage:

これは、LaunchServicesデータベースっていうのに、「URLをデフォルトで開くのはParallel DesktopのChrome」って登録されてるからっぽいです。なので、これを再構築しましょう。

```sh
$ cd /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Support
$ ./lsregister -kill -r -domain local -domain system -domain user
```

これで、 `open https://google.com` を実行するとmacのChromeでGoogleを表示してくれます:boy_tone1:
Djangoでlogin_requiredなAjax

## 概要

DjangoでAjaxするときに、Djangoページ内から@login_requiredなURLを叩くときの覚書

## 結論：creadentialsを入れるといいよ

### 叩きたいAPI

```python
@login_required
def hoge(request):
   return JsonResponse({"msg": "おｋ"})
```
### JavaScript

fetchのオプションにcredentialsを設定

```javascript

let url = '{% url "app:hoge" %}';
// credentialsを設定
let option = {
  cache: 'no-cache',
  credentials: 'same-origin'
};

// フェッチする
fetch( url, option ).then( res => { return res.json() } ).then( res => {
  console.log(res.msg);
});

```

## え？JQueryだったらって？

そんなもんググれ