OmniAICreator/Qiita-1.07M huggingface dataset:
改行コードを改行タグに変換する方法

機能追加中に少しはまったので，備忘録程度に一筆．

### 成り行き
以前一行の入力しかできなかった部分を，textareaに変えて複数行で入力できるようにしました．
これに伴って，内容の確認画面も複数行で表示できるようにしないといけなくなったのですが，
当然html側では改行コードがきても改行してくれません．
そこで改行コード(\r)を改行タグ(\<br>)に直す必要がでてきました．

#### やったこと
とりあえず文字の変換さえできれば何とかなるだろうと思い，[公式](http://flask.pocoo.org/docs/1.0/templating/#registering-filters)を参考にフィルターを作って使ってみました．

```Python3
@app.template_filter('cr')
def cr(arg):
    return arg.replace('\r', '<br>')
```

```html
{% for task in tasks %}
<table>
    <th>detail</th>
    <tr><td>{{ task[3] | cr }}</tr></td>
</table>
{% endfor %}
```


これで文字列中の改行コードが改行タグに変換されているはずとページを開いてみると

<table>
<th>detail</th>
<tr><td>あいうえお&lt;br&gt; かきくけこ</td></tr>
</table>

という感じになってました．
確かに変換はされていましたが，そのまま\<br>と表示されてしまいました...

何でだろうと思ってソース覗いてみると

```html
<table>
    <th>detail</th>
    <tr><td>あいうえお&lt;br&gt; かきくけこ</td></tr>
</table>
```

この有様です．
特殊文字がエスケープされてしまって，タグとして扱われていませんでした．

調べていくと[こちら](https://qiita.com/Prismo/items/7bfd6cd3b4b651b6094f)によさそうなことが書いてありました．
やはり特殊文字は何もしないでおくと，勝手にエスケープされてしまうようなので，
Markupクラスを使うか，safeフィルターをかける必要があるということでした．
ということで書き直しました．

```python
from flask import Markup
# 略

@app.template_filter('cr')
def cr(arg):
    return Markup(arg.replace('\r', '<br>'))
```

htmlは先に書いたコードのままです．
すでにフィルターをかけていて，その上にさらにフィルターをかけられるかわからなかったので，今回はMarkupを使いました．

これで改めてページを開くとちゃんと改行されてました．無事解決です．

#### 結論

タグに含まれる特殊文字が文字列中に含まれていると，自動でエスケープされてしまう．
そのため，タグとして扱ってほしければMarkupクラスを用いるか，safeフィルターをかけてエスケープされないようにする．

最後に改めて参考にさせていただいたページを載せておきます．
http://flask.pocoo.org/docs/1.0/templating/#registering-filters
https://qiita.com/Prismo/items/7bfd6cd3b4b651b6094f
sympyで(積分)「2019 名古屋大学 前期日程 数学（理系） ［1］」 をやってみたい

読売新聞
https://www.yomiuri.co.jp//nyushi/sokuho/k_mondaitokaitou/nagoya/mondai/img/nagoya_zenki_sugaku_ri_mon.pdf
https://www.yomiuri.co.jp//nyushi/sokuho/k_mondaitokaitou/nagoya/mondai/img/nagoya_zenki_sugaku_ri_mon.pdf

wolframalpha
(1) わかりませんでした。
Integrate[1/cos(x),{x,0,pi/3}]
https://www.wolframalpha.com/input/?i=Integrate%5B1%2Fcos(x),%7Bx,0,pi%2F3%7D%5D
integral_0^(π/3) 1/cos(x) dx = 2 coth^(-1)(sqrt(3))?1.3170
2 ArcCoth[Sqrt[3]]

(2) わかりませんでした。
Integrate[1/cos(x)**n,{x,0,pi/3}]
https://www.wolframalpha.com/input/?i=Integrate%5B1%2Fcos(x)**n,%7Bx,0,pi%2F3%7D%5D
((Sqrt[Pi] Gamma[1/2 - n/2])/Gamma[1 - n/2] + (2^n Hypergeometric2F1[1/2, (1 - n)/2, (3 - n)/2, 1/4])/(-1 + n))/2

```fullscript.py
from sympy import *
x = Symbol('x')
n = symbols('n', integer=True)
print('(1)--------------------------------------------')
f=1/cos(x)
print(f)
print(integrate(f,(x, 0, pi/3)))

print('(2)--------------------------------------------')
f=1/cos(x)**n
print(f)
print(integrate(f,(x, 0, 1)))
# (1)--------------------------------------------
# 1/cos(x)
# log(sqrt(3)/2 + 1)/2 - log(-sqrt(3)/2 + 1)/2
# (2)--------------------------------------------
# cos(x)**(-n)
# Integral(cos(x)**(-n), (x, 0, 1))
```
Vuetifyのカラーバリエーションの計算方法を調べてみた

# 背景

業務でUIにも関わらせていただくようになりましたが、
デザインで難しいと感じる点は、
判断の基準が主観的になりがちで曖昧なところです。

（例えば、余白はどれくらい、とか文字の大きさは、色は...とか、
結局人の目で見ての判断になりがちで、数値などの具体的なルールに落とし込むのが難しい）

そんな中、今後デザインで参考にできる**客観的な指標**はないものか...と思い、
**Vuetify**を例にカラーバリエーションの計算方法を調べてみることにしました。

# この記事に書いてあること

- [Vuetifyのカラーバリエーション](https://vuetifyjs.com/ja/framework/colors)の計算方法について
    - 今回は「lighten」「darken」を含む、濃淡(明度変化)についてしか書いていません
    - 「accent」はまた今度時間があれば調べたいと思っています

# 結論

- Vuetifyでは色の濃淡の計算に**Lab表色系**を用いている
    - 1段階につき**L(明度)**を `10` ずつ変えて濃淡を表現している
- Lab表色系は色の差を**人間の感覚**に近づけたもの
    - 人間が見ていい感じの配色ができる

# 本論
## Vuetifyとは

[Vuetify](https://vuetifyjs.com/ja/) はVue.js向けのUIコンポーネントライブラリです。
Googleの[マテリアルデザイン](https://material.io/design/)に基づいてデザインされています。

既存のカラーからUIのメインテーマとなる色を選ぶことができますが、
好きな色を設定してカスタマイズもできます。
<img width="1439" alt="スクリーンショット 2019-03-03 2.13.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/175234/d61e3b53-a675-f8f2-e894-30289920e620.png">

## カラーバリエーション

以下のように、ひとつの色に対して
**明るい色、暗い色、アクセントカラー**を含めたカラーバリエーションが用意されています。
[こちら](https://vuetifyjs.com/ja/framework/colors)のページから直接ご覧頂けます。

このカラーバリエーションを生み出している計算方法を探っていきます。
<img width="696" alt="スクリーンショット 2019-03-03 2.33.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/175234/f422a5b1-6910-1192-4ba6-a4352a4b7dcf.png">

## 計算方法

Vuetifyのコードを読んで調べていくと、
ソースの以下の部分に計算方法が書かれていることがわかりました。

```

src
  ├ ...
  └ util
      ├ colorUtil.ts
      ├ theme.ts
      └ color
          ├ transformCIELAB.ts
          └ transformSRGB.js
```

ソースは[こちら](https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src)

大元はtheme.js内の `parse()` メソッドで、ここから順に処理が行われますが、
おおよそ次の手順で色の生成を行なっているようです。

1. カラーコード(16進数)を10進数に変換する
2. 10進数に変換した色を**XYZ表色系**の値に変換する
3. 色のXYZ表色系の値を**Lab表色系**の値に変換する
4. 色の明るさの値(L)を `±10` する
5. 色をXYZ表色系に変換する
6. 色を10進数に変換する
7. 色をカラーコードに変換する

最終的に、**Lab表色系**の値で濃淡を調整しているようです。

## Lab表色系

>絶対的な色空間として，3刺激値をそのまま用いた XYZ 表色系では，人が識別できる色差が色の領域によってかなり異なることが知られている。 そこで，できるだけ人間の感覚に近い均等な色空間として考案されたのが Lab 表色系である 

引用： [Lab 表色系 / Lab color space](http://w3.kcua.ac.jp/~fujiwara/infosci/lab.html)

とあります。

3刺激値をそのまま用いたXYZ表色系では、
2つの色について、数値の上での差と実際に人間が見て感じる差には、ばらつきがあります。
数値で表した場合の色の差と、実際に人間が感じる色の差を近づけたのがLab色空間です。

つまり、Lab表色系を使えば、実際に人間が見て均等な差を感じるグラデーションを
客観的な計算によって定義することができるのです。

# おわりに

このような客観的な指標があると、デザインスキルの有無に関わらず、
ある程度整ったものができるのでよいですね。

今後色を決める際は、
Vuetifyの計算方法(Lab表色系で10ずつ明るさを変化させる)も
使用してみようかと思います。

**追記**
将来、CSSでlab表記ができるようになるかもしれないんですね。。。
https://triple-underscore.github.io/css-color-ja.html#specifying-lab-lch
はじめてのC++【6日目】

#はじめに
ついに新章の5章に突入します！
今日は朝に少しと夜に少しだけやった。
友人にAtCoderという競プロのサイトを教えてもらったので明日から始める。明日はABC大会？みたいなので一度参加してみようと思う。
##05-01 配列の配列の配列の・・・・・
配列の配列で２次元配列ができる。
<img width="500" alt="スクリーンショット 2019-03-02 7.56.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/fa7b04b0-3dfc-a355-3f28-af8f6b18f49b.png">
<img width="199" alt="スクリーンショット 2019-03-02 7.56.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/c2e155db-ec5a-7970-6a60-cc19314d860c.png">
配列の配列の配列の・・・をする場合はサイズが大きすぎる可能性が出てくるので注意する。
大きい配列を作るときは「メモリの動的確保」というものを使う。しかし、それを使ってもメモリが足りないこともある。もしそうなった場合は、いろいろな工夫が必要である。

##05-02
array[i]は&array[i][0]と同じである。
初期化において配列のサイズを省略できるのは1番目だけである。
例)array[3][]

##05-03　構造体1

```struct.cpp
struct Student{
  char name[MAX_NAME + 1];
  int scoreJapanese;
  int scoreMath;
  int scoreEnglish;
}
```
このように

```
struct タグ名{
　変数宣言群
};
```
となっている。これらの変数群をひとまとめにできるような「新しい型」ができる。この新しい型の名前は「タグ名」、「struct タグ名」と呼ばれている。そして、この型を使って作られる新しい型のことを「構造体」。タグ名は「構造体名」、「構造体タグ」とよばれている。
nameやscorejapaneseなどといった構造体の要素のことを「メンバ」という。また、nameやscorejapaneseは変数なので「メンバ変数」と呼ばれている。

"注意" structの型を作成しただけでは、メモリ上に置かれた変数は何一つない。
構造体の変数を作って初めて、そのメンバはメモリ上に置かれる。そして、メモリ上に存在している、ある型のことを、その型の「実体（インスタンス）」という。
また、構造体は情報の塊なので「オブジェクト」ということもある。

```Student型の変数を作成.cpp
Student student;
```

メンバの使い方

```
オブジェクト.メンバ
student.name
student.scoreMath
```

##05-04 構造体2
<img width="649" alt="スクリーンショット 2019-03-03 3.35.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/dc9c2d42-adb0-2199-872e-40d55d2a9bf1.png">
<img width="235" alt="スクリーンショット 2019-03-03 3.36.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/cc691a65-7235-b2d5-983d-89b666b20ecd.png">
構造体はデータ量が多いので、参照渡し（あるいはポインタ渡し）するのが普通。値渡しにしたら、膨大なデータがコピーされるので注意。

##05-05 構造体3

```cpp
//同じ意味
(*pointer).name
pointer -> name//ポインタ -> メンバ名
```
シンタックスシュガーみたいなものかな

#終わりに
眠たい
明日の大会楽しみ
macOSで不可視ファイル属性を付与/削除する

###拡張属性 eXtended ATTRibute (xattr)
「macOS」「拡張属性」で検索するとほとんどが拡張属性を削除する方法で、付与する方法について説明されているページが少ないことと、「macOS」「不可視ファイル」で検索するとほとんどが「.(ピリオド)」から始まるフォルダにすれば不可視になるという説明や、不可視ファイルを閲覧可能にする方法の説明ばかりだったので、ここではmacOSがFinderでの可視・不可視を指定している仕組みと、それを利用して任意のフォルダ・ファイルの可視・不可視を操作する方法をまとめてみます。

###可視・不可視を決定する拡張属性
macOSの不可視フォルダの1つとしてLibraryフォルダを見てみると、ファイルモードの末尾に拡張属性が付いていることを示す@マーク付いています。
拡張属性を操作するコマンドxattrを用いてどんな拡張属性が付いているか、Libraryフォルダを見てみるとcom.apple.FinderInfoに対して16進数で値が付加されていることがわかります。
結論から言うとこれがフォルダ・ファイルを不可視化する属性になります。

```terminal
$ ls -la ~/
dwrx------@ user group Library

$ xattr -l ~/Library
com.apple.FinderInfo:
00000000  00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00  |........@.......|
00000010  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
00000020
```

###不可視拡張属性を付与/削除する
まずは上記のLibraryフォルダから拡張属性を外してみます。

```terminal
$ xattr -d com.apple.FinderInfo ~/Library

$ ls -la ~/
dwrx------  user group Library
```
これでLibraryに付いていたFinder(com.apple.FinderInfo)に関する拡張属性が削除され、FinderからLibraryフォルダが閲覧可能となりました。

次に、不可視拡張属性を付与します

```terminal
$ xattr -wx com.apple.FinderInfo 0000000000000000400000000000000000000000000000000000000000000000 ~/Library

$ ls -la ~/
dwrx------@ user group Library

$ xattr -l ~/Library
com.apple.FinderInfo:
00000000  00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00  |........@.......|
00000010  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
00000020
```
元通りになり、FinderからはLibraryフォルダは不可視となりました。

###まとめ

```console
$ xattr -d com.apple.FinderInfo Folder #可視化

$ xattr -wx com.apple.FinderInfo 0000000000000000400000000000000000000000000000000000000000000000 Folder #不可視化
```

###補足：xattrコマンド
|option||syntax|
|:--   |:-- |:-- |
|      |拡張属性名の表示　　　　　|$ xattr [-lrsvx] *file*
|-c    |拡張属性の全消去　　　　　|$ xattr -c [-rsv] *file* ...
|-d    |指定した拡張属性の消去　　|$ xattr -d [-rsv] *attr_name* *file* ...
|-h    |ヘルプ
|-l    |拡張属性名と値の表示　　　|$ xattr -l [-rsv] *file*
|-p    |指定した拡張属性の値の表示|$ xattr -p [-lrsvx]
|-r    |ディレクトリを再帰的に検索|
|-s    |シンボリックリンクを辿らずリンク自体を対象とする
|-v    |対象ファイルが1つのみの場合もファイル名を表示する
|-w    |拡張属性値の書込
|-x    |拡張属性値を16進数表記とする
※拡張属性値を書き込む際は16進数表記で32bit単位の値である必要があるとのこと
LaTeX2e -> MacTeX -> BasicTeXのメモ

改正版第６版 $\LaTeX2$$\varepsilon$(←どうでもいいけど/LaTeXeが使えなかった．)のROMに入っているTex-liveは2013年版．
現在最新のは2018年版（そのうち2019が出るけど）．
更新したいと思いたった．
目標は，今まで通りTeXshopで書いたコードが，タイプセットを押すことでpdfにアウトプットされるようにすること．

#とりあえず今ある環境のTeXの削除
`/Application/`中のTeXのアプリ(TeXshopなど)をそのままゴミ箱へ．
`/Library/TeX/`もゴミ箱へ．
`/usr/local/texlive/`もゴミ．
後，`/usr/local/share/ghostscript/`と，`/usr/local/share/`にある関係のありそうなもの（確か`texinfo`みたいなのとか）をゴミ箱へ． 

よくわからんからとりあえずゴミ箱に関係のありそうなやつは放り込みまくった．

---
参考
http://ikapblg.blog.fc2.com/blog-entry-141.html

#MacTeXのインストール
Homebrewは入っているので，それでやることにする．
**注意：MacTeXをインストールした時はTeXshopの動作確認までしてない．入れるだけ．**
TeXWikiを参考に．

```
% GUI-Applications ありの場合

$ brew cask install mactex
% brew caskは入れてなかったけど，勝手に入った．時間かかる．

$ sudo tlmgr update --self --all
% tlmgrはTeXのパッケージ管理ツール．このコードはぶっこんだ全てのパッケージをアップデートする．クソ時間かかる．

$ sudo tlmgr paper a4

```

こいつをターミナルで実行．
クソ時間がかかる．
これはSSDの肥やしになるなぁと思い，インストール終了後にアンインストールを決意する

---
参考
https://texwiki.texjp.org/?TeX%20Live%2FMac#texlive-install-pacman

#MacTeXのアンインストール
brewでぶっこんだものは，brewでアンインストールしようと思いたった．

```
$ brew cask uninstall mactex
```
これを動かすだけ．ただ何回か失敗した．その度にこのコードを動かして，最終的には

```
==> Removing files:
/usr/local/texlive/2018
/Applications/TeX
/Library/PreferencePanes/TeXDistPrefPane.prefPane
/Library/TeX
/etc/paths.d/TeX
/etc/manpaths.d/TeX
```
って出てきておしまい．
あとは，残渣を消す．BasicTeX入れるから，消さなくてもいいきもするけど．

---
参考
https://oversleptabit.com/archives/4701

#BasicTeX入れる
```
% 一応これらも入れた（入ってた気がするけど）
$ brew install ghostscript
$ brew install imagemagic

$ brew cask install basictex

% brewにはtexshopもある．すこ．
$ brew cask install texshop

%下のコードを動かす前に，やった．それでもtexshopが動かない．
$ sudo tlmgr install ptex2pdf

%TeXを日本語に対応させる．これをせずにドツボにはまった．これでも困ったら，参考のところのコードを動かせば良いかと．
$ sudo tlmgr install collection-langjapanese

```

---
参考
https://texwiki.texjp.org/?BasicTeX#w71ff68b
https://qiita.com/nqomorita/items/8491e10866aa53277f80#basictex%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

#TeXshopの設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223577/a060a27c-248e-8c57-214d-b87b775ed3fb.png)


TeXshopの環境設定左下の設定プロファイルからpTeX(ptex2pdf)を選択．
これだけで多分動くと思う．
それでも動かない場合．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223577/1181da63-4924-8696-482b-24b94c60930b.png)
ここを上が`ptex2pdf`があるフォルダ，下を`Ghostscript`があるフォルダに設定する．

まあここまでしたらいけるはず．

---
参考
https://medemanabu.net/latex/mactex-texshop-ptex-platex/
https://qiita.com/takenawa/items/c72835d67bf14928e0e9#5-texshop-%E3%81%AE%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A
https://texwiki.texjp.org/?TeXShop%2F%E8%A8%AD%E5%AE%9A#ptex2pdf
複数の表から条件に合致するデータを抽出するマクロ

複数のQA表の未完了QAを確認できるように、抽出マクロを作成してみた。

QA表はこんなイメージ

![0303.PNG](https://qiita-image-store.s3.amazonaws.com/0/370717/3438a28f-7eef-dd56-dfdf-8859d3310bb4.png)

QA未完了一覧はこんなイメージ

![0303_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/370717/c8420ddf-adba-7b75-705e-bef5bdd21086.png)
![0303_3.PNG](https://qiita-image-store.s3.amazonaws.com/0/370717/4b4a5444-6444-87c9-cb64-bb55ea7c5ce1.png)


マクロはこんな感じ

Sub 未完了QA抽出()

    Dim qaBookAddress As String
    Dim qaBooksRow As Integer, qasRow As Integer, qasExtractRow As Integer, i As Integer, j As Integer
    Dim qa As Workbook
        
    '一覧をクリアする
    ThisWorkbook.Sheets(1).Range(Cells(3, 1), Cells(1000, 9)).ClearContents
        
    '開始位置の設定
    qaBooksRow = 2
    qasExtractRow = 3

    For i = qaBooksRow To ThisWorkbook.Sheets("config").Cells(Rows.Count, 2).End(xlUp).Row
    
        qaBookAddress = ThisWorkbook.Sheets("config").Cells(i, 2)
        
        Set qa = Workbooks.Open(Filename:=qaBookAddress)
        
        qasRow = 2
        
        For j = qasRow To qa.Sheets(1).Cells(Rows.Count, 5).End(xlUp).Row
                
            If qa.Sheets(1).Cells(j, 6).Value <> "完了" Then
            
                qa.Sheets(1).Range(Cells(j, 1), Cells(j, 9)).Copy
                ThisWorkbook.Sheets(1).Cells(qasExtractRow, 1).PasteSpecial Paste:=xlPasteValues
                
                ThisWorkbook.Sheets(1).Cells(qasExtractRow, 10) = qaBookAddress
                
                qasExtractRow = qasExtractRow + 1
                
            End If
            
        Next j
        
        Application.DisplayAlerts = False
        qa.Close
        Application.DisplayAlerts = True
        
    Next i

End Sub
WSLでemacsclientをGUIで使えるようにする（その1）

[前回](https://qiita.com/kuro_23/items/d4e84f332dbb57ae9fed)（といっても2年以上前）で、WSL上のEmacs環境は構築できたんですが、その後いろいろと変えたところもあるので、そこら辺をまとめてみます。

# やりたいこと
Emacsをサーバーで動かして、emacsclientをGUIで起動できるようにする。

# Emacsのインストール
まずは環境構築ということで、Emacsのインストールから。

以前は野良ビルドしてました。この理由は、UbuntuのパッケージのEmacsは基本GTK3をリンクしていると、私の環境ではウィンドウがちゃんと開かないため、GTK2でリンクしたものを作りたいというものでした。

ということで今も野良ビルドしてます。最近は、何も考えずに

```
$ ./confiugre
$ make
$ sudo make install
```

で普通に動いてます。ちなみに、X ServerをVcsrvからX410というストアアプリへ変更したらGTK3でも問題なくなったのでconfigureにはオプション付けてません。なぜなのかは理由は知りませんが、困っている場合には試す価値はあるんじゃないですかね。今だと4,700円引きですし(笑)。

# Emacsをサーバーにする
やり方は[こちら](https://ayatakesi.github.io/emacs/26.1/html/Emacs-Server.html)を参照。

半分ぐらいはお好みなんでしょうが、個人的にはバックグラウンドで動かすということで、ひとまず.bashrcに以下の記述を入れてみました。

```sh:.bashrc
# emacs daemon
function emacsdaemon() {
        isAlive2=`ps -ef | grep "emacs --daemon" | grep -v grep | grep -v srvchk | wc -l`
                if [ $isAlive2 = 0 ]; then
                cd > /dev/null 2>&1
                rm -f ~/tmp/emacs/*
                emacs --daemon > /dev/null 2>&1
                fi
        }
emacsdaemon

alias emacstty='emacsclient -t'
alias emacsgui='emacsclient -c'
alias emacskill="emacsclient -e '(kill-emacs)'"
alias emacsrestart="emacsclient -e '(kill-emacs)' && emacsdaemon"
```
なんかややこしいことをしてますが、ターミナル（wslttyを使ってます）を起動したときに自動的に起動するような形をとるために、psで起動チェックした上でサーバーを起動するということをやってます。あとは、server socketがゾンビ化してしまうことがままあるようなので、起動時に消しておくということもやってます。

# 目的達成したけど…。
これでターミナル上からemacsclientを起動するのは問題なく動きます。emacs側の設定はソケットファイルの指定しておくとよい感じです。

```emacs-lisp:init.el
(setq server-socket-dir "~/tmp/emacs")
```

ただ問題というか願望がいくつかありまして…

1. ターミナルを起動しないとサーバーが起動しない
1. Windowsのデスクトップから起動したい
1. GUIで起動した場合のフォントセットやフレームのサイズが反映されない

ということで、この辺の対策を考えてみます。

## Windows起動時にサーバーを起動させる
これはまあバッチファイルですわね。

```powershell:emacsdaemon.bat
@echo off
bash.exe -c "/usr/local/bin/emacs --daemon"
```

これをスタートアップに入れとけば良し。起動時にウィンドウが開くのがいやならショートカットのプロパティを最小化で起動するようにしておけばいいですね。まあ初回だけなので私はウィンドウを開いてますが。

## Windowsのデスクトップから起動する
これもバッチファイルなんですが、コマンドプロンプトのウィンドウが開かないようにするために一工夫が必要。[この辺り](https://xztaityozx.hatenablog.com/entry/2017/12/01/001544)を参考に以下のようなファイルを作成します。

```vb:emacs.vbs
Set ws = CreateObject("Wscript.Shell")
ws.run "powershell -NoProfile -ExecutionPolicy Unrestricted .\launch.ps1",0,false
```

```powershell:launch.ps1
bash.exe -lc "exec emacsclient -c -s ~/tmp/emacs/server --display=localhost:0.0"
```

emacs.vbsのショートカットをデスクトップに作成して、アイコンをEmacsにすればサーバーさえ起動していれば一瞬でフレームが開くようになりました。

あとはフレームとフォントセットですが、長くなったので次回へ。
エンジニアは英語を勉強すべきなのか？いや、それより日本語だ

プログラミングをするにあたって英語が必要だと言われることが多いけど、
その英語ができないエンジニアは、英語以前の問題だという話

## ローマ字で変数名を付けてしまうプログラマ
そのローマ字の言葉をネットで検索すれば大半解決するよ
自分の記憶だけでプログラミングしようとしないで

## 意味の違う変数名を付けてしまう
検索した結果で一番上に出てきた単語を使ったん？
検索したときに複数の候補があるなら、
そこに出てくる単語の中から一番近い単語を使えばいい

## 辞書を見てもぴったりな単語が見つからない
仕様書に書いてある日本語をそのまま翻訳してない？
日本語をそのまま翻訳せずに、
言葉の使用用途を翻訳する事で順当な言葉が見つかることが多い

## なじみの薄い言葉を使ってしまった
複数ある単語の中で一番妥当だと思ったのなら、
他のプログラマを巻き込んで一番妥当だと思う単語を決めましょう
なじみの薄い単語でも、周囲の人が知ってしまえばなじみのある言葉になります
そして、それが間違いであるなら、周りの人が正してくれるはずです

## 英語的になんかおかしい？
品詞って知ってる？
“〇〇をする関数”の〇〇という単語を調べると“名詞”って出てきたりしません？
「名詞を動詞する」「形容詞な名詞を動詞する」
こんなふうに、
日本語でやりたいことを書きだし、
使いたい単語を翻訳するときに、日本語での品詞の単語をチョイスすれば、多少文法が間違っていても意味が通じます


## 終わりに
この問題もっと厳密に解決しようと思えば、
英熟語を避けるとか、接続詞を使わないようにするとか、動詞＋名詞のパターンをできるだけ厳守するとか、
説明しようにも説明しきれないややこしいことになるんですけど、
ここに書いたことをやることで、変な名前を付けてしまう問題をそこそこ減らせます

変な名前を付けていると指摘される事が多い人は、
ここに書いたことを意識してみるといいかも
awslogsの時刻範囲にはISO 8601形式が指定出来る

https://github.com/jorgebastida/awslogs

```bash
$ awslogs --version
awslogs 0.10.0

$ awslogs get {log_group_name} -G -S -s='2019-01-01T00:00:00+09:00' -e='2019-01-01T00:00:05+09:00'
.
.
```

調査の時などは、基本JSTの時間を扱うことが多いため、UTCに直して指定しなくても良いので便利。
dyld: lazy symbol binding failed: Symbol not found: _PySlice_Unpack

いつものようにPytorchで簡単なコードを実行しようとしたら見慣れないエラーが！！

```
dyld: lazy symbol binding failed: Symbol not found: _PySlice_Unpack
  Referenced from: /Users/kamatahiromichi/anaconda/lib/python3.6/site-packages/torch/lib/libtorch_python.dylib
  Expected in: flat namespace

dyld: Symbol not found: _PySlice_Unpack
  Referenced from: /Users/kamatahiromichi/anaconda/lib/python3.6/site-packages/torch/lib/libtorch_python.dylib
  Expected in: flat namespace

Abort trap: 6
```

なんだこれ...と思ったんですが、出てるパスはanaconda周りのことなので、
ハハァ、またcondaが余計なことしてるなと思い、とりあえず`conda list`

```
 $ conda list | grep torch
pytorch                   0.4.1           py36_cuda0.0_cudnn0.0_1    pytorch
torch                     1.0.0                     <pip>
torchvision               0.2.1                     <pip>
torchvision               0.1.9                    py36_1    soumith
```
お、なんかtorchvisionが二つ入ってるぞ...
condaで入れた方はいらなそうだから、`conda uninstall torchvision`したら動くようになりました

[教訓] やはりcondaとpipを共存させてはだめですね
C#+ConsoleAppFrameworkでJSONを楽に生成できるツールの移植の移植をしてみる

先日以下の記事を書きました

[ConsoleAppFrameworkを試してみる](https://qiita.com/orange634nty/items/5bf8c73612a5d3fbc1db)

ちょっと試しに [ConsoleAppFramework (MicroBatchFramework)](https://github.com/Cysharp/ConsoleAppFramework) を使ってみたいのですが、何かいい案がなく困っていました。
そんな時に以下の記事をみました。

[JSONを楽に生成できるツールを移植してみた](https://qiita.com/gorilla0513/items/e3b0358ffbc0db0a2787)

仕様的にそこまで難しくなさそうなので、自分にも出来そうと思い試しに作ってみました。
移植の移植です。

成果物は以下のリポジトリにあります。

[orange634nty/csjo](https://github.com/orange634nty/csjo)


＊この記事を書いた時点では ver0.3 でしたが、ver0.4 で変更があったので一部最新の情報と異なる部分があります。

## 環境

＊ MicroBatchFramework は ConsoleAppFramework に名前が変わりましたがコードの方はまだ未対応ですmm

- mac book air
- netcoreapp2.2
- package version
    - MicroBatchFramework 1.0.0
    - Microsoft.Extensions.Hosting 2.2.0
    - Microsoft.Extensions.Logging 2.2.0
    - Newtonsoft.Json 12.0.1

## 仕様の変更

joやgjoの仕様については本家のドキュメント等を確認していただければと思います。

- [jpmens/jo](https://github.com/jpmens/jo)
- [skanehira/gjo](https://github.com/skanehira/gjo)

今回はgjoの仕様に合わせて作っています。
しかし、今回はMicroBatchFrameworkで提供されている機能を出来るだけいかして作りたいので、以下の部分を変更しています

ヘルプは `-h` オプションではなく、 `help` コマンドを使います。
この `help` コマンドはMicroBatchFrameworkでデフォルトで用意されているものです。

```console
$ csjo help
argument list:
[0]: String
-a, -isArray: [default=False]is array.
-p, -pretty: [default=False]pretty print json.

version: 
-p, -pretty: [default=False]pretty print json.
```

また、バージョン情報は `version` で表示するようにしました。

```console
$ csjo version -p
{
  "Program": "csjo",
  "Description": "This is inspired by jpmens/jo and skanehira/gjo",
  "Author": "orange634nty",
  "Repo": "https://github.com/orange634nty/csjo",
  "Version": "1.0.1"
}
```

試しにpublishして使ってみました

```console
$ csjo "status=$(csjo "name=orange634nty level=1 lang=$(csjo "csharp python node.js" -a)")" -p
{
  "status": {
    "name": "orange634nty",
    "level": 1,
    "lang": [
      "csharp",
      "python",
      "node.js"
    ]
  }
}
```

ただ、引数を後ろにしないとエラーになります……

```console
$ csjo -p "name=orange634nty level=1" # error
$ csjo -p true "name=orange634nty level=1" # これもerror
$ csjo "name=orange634nty level=1" -p # これはOK
{
  "name": "orange634nty",
  "level": 1
}
```

これは時間がある時に直してみます。

## 感想

簡単かなーと思いましたが途中でつまづいてしまい、がっつりgjoのコードを読ませていただきました。ありがとうございます。
また、今回出来るだけ元の機能をいかして移植しようとしたので、MicroBatchFrameworkの内部のコードを読んだりして勉強になりました。
まだ、コード自体も多分バグなどもあると思うのでもう少し時間がある時に直していきたいと思います。
ついでにいい機会なので、このツールの配布とかも調べてやってみようと思います。
DeconstructメソッドがKeyValuePair<TKey, Tvalue>などに追加されて、ValueTupleみたいに分解宣言できるようになる

分解宣言については、ufcppさんの[複合型の分解](https://ufcpp.net/study/csharp/datatype/deconstruction/)がとてもわかりやすいので、そちらを参照してください。

さて、この分解ですが`ValueTuple`型でなくても`Deconstruct`という名前のインスタンスメソッドか拡張メソッドを持っていれば使うことができます。

標準ライブラリの型に`Deconstruct`という名前のインスタンスメソッド、もしくは拡張メソッドが加わり分解ができるようになりました。

（正確には、追加前から自前で拡張メソッドを作れば分解はできていたのですが、標準ライブラリに追加され自前で用意する必要がなくなりました。）

# KeyValuePair\<TKey, TValue\>


* .NET Standard 2.1~
* .NET Core 2.0~
* .NET Framework まだ（.NET Standard 2.1に入ったので、そのうち.NET Frameworkでも実装されるでしょう）

[リファレンス](https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.keyvaluepair-2.deconstruct?view=netcore-2.0#System_Collections_Generic_KeyValuePair_2_Deconstruct__0___1__)

`KeyValuePair<TKey, TValue>`にも`Deconstruct`という名前のインスタンスメソッドが追加されました。

これにより、以前はこう書いていたコードが、

```csharp
Dictionary<string, int> dict = LoadDictionary();
foreach (var keyValuePair in dict)
{
    var key = keyValuePair.Key;
    var value = keyValuePair.Value;
    Console.WriteLine($"key: ${key}, value${value}");
}
```

こんな感じで書くことができます。

```csharp
Dictionary<string, int> dict = LoadDictionary();
foreach ((string key, int value) in dict)
{
    Console.WriteLine($"key: ${key}, value${value}");
}
```

スッキリ！

# 各種Tuple

* .NET Standard 2.0~
* .NET Core 1.1~
* .NET Framework 4.7~

[リファレンス](https://docs.microsoft.com/ja-jp/dotnet/api/system.tupleextensions?view=netstandard-2.0)

`Tuple<T1,T2>`や`Tuple<T1,T2,T3>`なのど各種Tupleクラス（`ValueTuple`構造体ではなく、`Tuple`クラス）には、`TupleExtensions`クラスに拡張メソッドとして`Deconstruct`メソッドが定義されています。

`ValueTuple`と同じように、`Tuple`も分解ができます。

# DictionaryEntry

非ジェネリックな`System.Collections`名前空間の型。使う機会は多くはないでしょうが、これにも`Deconstruct`メソッドが追加されたようです。

* .NET Standard 2.1~
* .NET Core 2.0~
* .NET Framework まだ（.NET Standard 2.1に入ったので、そのうち.NET Frameworkでも実装されるでしょう）

[リファレンス](https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.dictionaryentry.deconstruct?view=netcore-2.2)

# まとめ

今までも、自分で拡張メソッドをつくれば分解できましたが、標準でも追加されましたね！
docker-composeでシンプルにpython環境構築

# はじめに
以前から、興味のあったpythonを触ってみようと思い、とりあえず開発環境を作ってみました。もちろん、使用するのはDockerです。今回は、docker-composeを使って、シンプルなpythonの実行環境を作成する方法をご紹介します。

# 環境
- macOS Mojave 10.14.3
- Docker version 18.09.2, build 6247962
- docker-compose version 1.23.2, build 1110ad01

# 構成
今回は以下のような構成になります。

```
.
├── docker
│   └── python
│       └── Dockerfile
├── docker-compose.yml
└── server
    └── test.py
```

# 手順
## 1. docker-compose.yml作成
まずは、docker-compose.ymlを作成します。
といっても、コンテナはpython用の1つのみなので、とてもシンプルです。

```docker-compose.yml
version: '3'
services:
  app:
    build: ./docker/python
    volumes:
      - ./server:/var/www/html
    tty: true
```

## 2. Dockerfile作成
pythonコンテナ作成用のDockerfileを作成します。
**私の環境では、EXPOSEで80番ポート待ち受けの記載をしなければ、コンテナがすぐ落ちちゃいました。**

```Dockerfile:Dockerfile
FROM python:3.7
WORKDIR /var/www/html
EXPOSE 80
```

## 3. サンプルファイル作成
python動作確認用のファイルを作ります。
とりあえず、コンソールにHello worldを表示させるサンプルにします。

```python:test.py
print('Hello world')
```

# 動作確認

dockerの起動

```bash
docker-compose up -d
```

コンテナに入ります

```bash
docker-compose exec app bash
```

サンプルの実行

```bash
python test.py
```

コンソールにHello worldが出力されれば成功です。

# 最後に
かなりシンプルなので、思ったより簡単に作成できましたね。
とりあえず、これからpythonを色々触ってみよーと思います。
乞うご期待(笑)


# 参考
[docker-compose で簡単! 最小お手軽構成のPythonテスト環境](https://qiita.com/tyamahori/items/f8a7771f0454dcc4fd17)
[PyCharm + Docker + Python3.7の開発環境構築メモ](https://qiita.com/tomitz/items/722960b124600391f491)
「クラウドゲームをつくる技術」で解説されているゲームライブラリ moyai の動かし方

##概要
githubのサンプル、もしくは本の275ページから書いてあるけど、すぐに解らなかったので。

「クラウドゲームをつくる技術」
https://gihyo.jp/book/2018/978-4-7741-9941-2

ゲームライブラリ moyai サンプル
https://github.com/kengonakajima/moyai_samples

環境
Mac OS 10.14 + Xcode 10.1

##インストール

```bash

xcode-select --install
git clone https://github.com/kengonakajima/moyai_samples
cd moyai_samples
git submodule update --init
brew install autoconf
brew install automake

#moyai を make
cd moyai
make

#moyai_samples を make
cd ..
make
#※ OpenGL API が deprecated である warning が出るが動く。
```

##起動
サーバー起動
※ キャラクターが表示されるまで十数秒かかります

```bash

./min --ss
```
viewer起動（別ターミナルで）

```bash
./viewer
```
報連相についての誤解を解きたい（新人〜2年目ぐらいの人向け

# 留意事項

ポエムなのでポエムが嫌いな方は戻るかタブを閉じて頂ければと思います。

報連相をわかりやすく説明するために、ざっくりとした説明になっている部分があります。一般的な報連相について整理した内容ではありません。

Qiitaのガイドラインに

> Qiitaは、プログラミングに関する知識を記録・共有するためのサービスです。

とあるので、Note辺りに書き散らかそうと思いましたが、プログラミングに全く関係無いわけでも無いのでQiitaにポストします。

何卒、ご了承ください。

# TL;DR

* 君を監視をしたいわけじゃなくて、悩みや困り事が無いかを知りたいんです。
* まだタスク終わらないの？とか言って君を責める材料を集めてるんじゃないんです。
* どうすれば君の悩みや問題を解決できるのか、どうしたら君を守れるのか、それを考えるためのヒントが欲しいんです。
* 報連相を通じて一緒に成長したいんです。

# 概要

報連相やれやれ言われるけど結局何の必要性があるの？とか、報連相ってただの監視でしょ、タスクが進んでないとできない奴扱いされるし残業して終わらせろとか言われるし。って思うこともあると思いますが、その誤解を解きたい。報連相はそんなことのためにあるんじゃないよって言っておきたいと思ったので書き残しておきます。
報連相とその必要性を自分の観点・考えでまとめてみようと思います。

# 報連相って何だろう？

報連相ってなんだろう？を整理していきましょう。

## 報告

タスク等、上司やリーダーから依頼されたことに対しての進捗や課題・問題を伝えます。簡単に言うと何か取り組んだことに対する結果や過程を上司やリーダーに伝える、という感じです。
例としては作業を振られて作業をして「今進捗は50%ぐらいで、xxxxライブラリの組み込みに手間取っています。公式ドキュメントは確認しましたが、不具合があるっぽくてもしかしたら他のライブラリを使う必要があるかもしれません」っていう感じかな。

## 連絡

認知している「これから起こる（基本的に）回避不可能なこと」を事前に伝えます。って言うと「僕、未来予知とかできません＞＜」となりそうですが、「明後日休みます」とか「寝坊したので遅刻します」とかそのレベルの内容です。例としては先に上げましたが、「電車遅延で30分遅刻します」とか「昨日飲みすぎて寝坊してこれから家出ます。13時には着くと思います」っていう感じかな。朝苦手な人は日〜木に飲むのを控えた方が良いかもしれないね。けど、飲みたくなる気持ちはよくわかる。飲み行く時は誘ってね。

## 相談

報告は「過去」に起きたこと、連絡は「未来」に起こること、相談はその間の「現在」に該当します。「今」起きている問題や課題、これから起きるであろう事象（明日休めたら休みたい、とかね）を話して、一緒に判断をしていくのが相談です。例としては「xxx機能の実装方法ですが、xxxxライブラリを使うか、自作でやってしまうか悩んでます」とか「自分のタスクの進捗が良いので、xxxさんのタスクのフォローに時間を使おうと思うんですけど良いですか」って感じかな。

## 報連相の要点まとめ

作業の進捗や結果は「報告」、これから起こる未来のことは「連絡」、現在進行形で起きていることは「相談」と考えてOKです。

# 報連相って何でするんだろう？

報連相が何かは何となくわかったとことで何で報連相が必要なのかを考えていきましょう。ちゃんと必要性があるからみんな報連相してーって言うわけですね。

## 報告して何が起こる？

過去のことを伝えて何をしたいんだろう...って思いますよね。進捗や稼働を教えてくれることで君の作業が滞り無く進んでいるか、稼働が高くなっていないかを見ています。進捗の進みが悪ければ仕様や技術課題があるのかな？とか、体調が良くなくて集中できなかったのかな？とか報告された方は君のパフォーマンスや生産性を上げる方法を考えます。君の進捗がどうだとか集中して作業してないとか、そういう事を言いたいわけじゃないんです。だから素直に教えてください、進捗が進んでないと怒られるとか評価悪くなるとかそういうこと気にしないでください。君のぶつかっている問題や課題を一緒に解決させて欲しいと思っています。

## 連絡して何が起こる？

朝、急に「今日休みます」って言われるとプロジェクト全体の進捗に影響が出ちゃうよね...だから休む日が決まっているなら教えて欲しいんだ。「何で休むの？」とかそんなことは聞かないよ。状況によっては他のプロジェクトメンバーにタスクを引き継いでもらったりする必要が出てくるよね。当日の連絡になるとドタバタしちゃうから予定がわかってるようなら教えてね。
平日から飲みすぎちゃうこともあるかもしれないし、その翌日の朝にいつも通り起きれないこともあると思います。そういう時は起きたら一報入れて欲しい。心配になるからね。1回2回は笑って許すよ。毎日毎日になると叱ると思うけど、そこは受け入れてね。

## 相談して何が起こる？

悩んでることや困ってることが解決できないと作業が進まないよね。その悩んでることや困っていることを一緒に解決していこう。もしかしたら僕のスキルじゃ解決できないかもしれないけど、そういう時は解決できる人にフォローしてもらうから安心して相談してね。君が悩んでいることや困っていることをクリアできたとしたらそれは立派な成長だよね、一緒に成長していこう。成長していこうってことは君だけじゃなくて僕も成長するんだよ。君の悩みや困り事を一緒に解決することで僕も成長するんだよ。だから「一緒に成長」していこうね。

## 要するに

* 君を監視をしたいわけじゃなくて、悩みや困り事が無いかを知りたいんです。
* まだタスク終わらないの？とか言って君を責める材料を集めてるんじゃないんです。
* どうすれば君の悩みや問題を解決できるのか、どうしたら君を守れるのか、それを考えるためのヒントが欲しいんです。
* 報連相を通じて一緒に成長したいんです。

最初に書いた内容ですね。

# 最後に

こんなこと思いながら報連相されるの待ってます、気軽に声掛けてね！
世の中の全員がこんな感じとは限らないから報連相する相手にちゃんと確認してね。
Docker/Rancher めも

# Docker/Rancher めも
めも

## netdata
netdataは、ZabbixやNagiosなどの監視ツールとは異なり、リアルタイムパフォーマンスモニタリングができるツール

```bash:docker-compose.yml
version: '2'
services:
 netdata:
   cap_add:
   - SYS_PTRACE
   image: netdata/netdata
   hostname: 172.31.33.31
   security_opt:
   - apparmor:unconfined
   volumes:
   - /proc:/host/proc:ro
   - /sys:/host/sys:ro
   - /var/run/docker.sock:/var/run/docker.sock:ro
   ports:
   - 19999:19999/tcp
```

## QuickChart
Google Chart APIの代替になります
詳しくは [こちら](https://github.com/typpo/quickchart)

```bash
docker pull ianw/quickchart
docker run -p 8080:3400 ianw/quickchart
```

## samba
```bash:docker-compose.yml
samba:
 image: dperson/samba
 container_name: samba
 ports:
   - "445:445"
 volumes:
   - /mnt/pub:/mnt/pub
 command:
   "-s pub;/mnt/pub;no;no;no;foo -u foo;password"
```
```bash:port解放
sudo firewall-cmd --zone=public --add-port=445/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports --zone=public
```

## postgres
```bash:docker-compose.yml
version: '2'
volumes:
  pgdata:
    driver: local
    per_container: true
services:
  postgres-lb:
    image: rancher/lb-service-haproxy
    ports:
    - 8150:8150/tcp
    labels:
      io.rancher.container.agent.role: environmentAdmin
      io.rancher.container.create_agent: 'true'
  postgres-data:
    image: busybox
    volumes:
    - pgdata:/var/lib/postgresql/data/pgdata
    labels:
      io.rancher.container.start_once: 'true'
  postgres:
    image: postgres:10-alpine
    environment:
      PGDATA: /var/lib/postgresql/data/pgdata
      POSTGRES_DB: postgres_sb
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
    stdin_open: true
    tty: true
    volumes_from:
    - postgres-data
    labels:
      io.rancher.sidekicks: postgres-data
```

## simpleなnginx
```bash:docker-compose.yml
version: '2'
services:
  web:
    image: nginx:1.15.9-alpine
    volumes:
    - /var/www/html
    ports:
    - 5080:80/tcp
```
Ruby の || を使った自己代入演算子


```ruby
a ||= 10
```  
って何だ！？ についてまとめた。

# 結論を先に
**`a ||= 10` は変数aが存在しない(又はnilやfalse)なら、右辺の変数aに10を代入する**

だ！！！

#おさらい
うん。
まずは || についておさらい

|| は、条件式でよく使う
条件式の or として利用されるパターン。
`if false || num == 1`

ここで以下のコードを見て欲しい。

```ruby
num = 1
p false || num == 1
```

表示はtrueとなる。
そりゃそうだろう。って感じだと思うけど、、、これを元に`||`を考えてみよう！！

##細かく分析してみる
|| についてちゃんと調べると、こいつは「左辺を評価してfalseだから、右辺を評価した」という動作をしている！！
上のコードでは条件式の結果は、最終的に`num == 1`ここを見ている。
↑ ここ重要

つまり！
**if の条件式だけで || を使ってると、
|| はtrueかfalseしか返さないのかな？って勘違いしやすい。**

でも実は、違う！

実際はリファレンスに書いてる通り！

#Rubyのリファレンスを確認！
Rubyのリファレンスより
『左辺を評価し、結果が真であった場合にはその値を返します。 左辺の評価結果が偽であった場合には右辺を評価し その評価結果を返します。 or は同じ働きをする優先順位の低い演算子です。』
[リファレンスのリンク](https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html#or)
<br>
これが大事！

例えば、

```ruby
num = 1
p false || num
```

を実行すると・・・
「1」が表示されるんだ！
<br>
もちろん、下も同じ結果になる

```ruby
p false || 1
```

#改めて `a ||= 10` を考える
よし！ 改めて `a ||= 10` を考えよう！

これは `a = a || 10` を自己代入演算子で書いた式だね
<br><br>
###自己代入演算子が何かと言うと・・・

`a (演算子)= b` は `a = a (演算子) b` と同じ意味
例)
`a += b` は `a = a + b`
`a **= b` は `a = a ** b`


ここまで来ると理解できそう
<br>
|| というのは、まず左辺を評価してtrueならその値を返し、falseなら右辺を評価するから・・・

**変数aがtrueなら**
→ aを返す

**変数aがfalseなら**
→ 10を評価する(ここで、trueになる)
→ trueになった10を返り値として返すから `a = 10` という式になる
<br>
**余談： ※Rubyでは変数は nil, falseでない限り、true**

```rb
kara = ''
n_hoge = 0
p 'true' if kara    # <= true
p 'true' if n_hoge  # <= true
```

#まとめ (結論)
```ruby
a ||= 10
```
**は変数aが存在しない(又はnilやfalse)なら、右辺の10を変数aに代入する**

理解できると、めちゃくちゃ楽しい！  
(/・ω・)/
<br>
issue番号を入れるだけでissueタイトルをつけてブランチを作成する

GitHubでissueを作成したのち，ローカルでissueタイトルを含めてブランチを作成するときにissueタイトルをコピペするのが面倒だったので，スクリプトを作成しました。
## スクリプト
``` sh:mkbranch
#!/bin/sh
USER_AND_REPO=`git remote -v | tr ' ' '\n' | tr ':' '\n' | sed -n 2P | sed 's/.git//'`
ISSUE_NUM=$1
# If the repository is secret, get 'Full control of private repositories' token from https://github.com/settings/tokens
GIT_HUB_API_TOKEN=''
GIT_HUB_ISSUE_URL=https://api.github.com/repos/${USER_AND_REPO}/issues/${ISSUE_NUM}
ISSUE_TITLE=`curl -su :${GIT_HUB_API_TOKEN} ${GIT_HUB_ISSUE_URL} | grep title | tr ':' '\n' | sed -n 2P | sed -e 's/ \|"\|,//g'`
if [ -z ${ISSUE_TITLE} ]; then
  echo "Can't get issue title."
  exit 1
fi
BRANCH_NAME=#${ISSUE_NUM}-${ISSUE_TITLE}

git checkout master
git pull origin master
git checkout -b ${BRANCH_NAME}
git push origin ${BRANCH_NAME}
```
[Gist](https://gist.github.com/akriaueno/1f71077005d3f3d253c18cc519a4367a)
GitHubのAPIを利用してissueのタイトルを取得しています。
issue番号とタイトルを元にブランチ名を決定し
1. masterにcheckout
2. リモートmasterをpull
3. ブランチの作成&checkout
4. ブランチのpush
を行います。
BRANCH_NAMEの部分をいじることでブランチ名のフォーマットを変更できます。

## 使い方
```
# プロジェクトディレクトリ下で
curl -sO https://gist.githubusercontent.com/akriaueno/1f71077005d3f3d253c18cc519a4367a/raw/debf08ffcf9eae944ca5a50de3ba790da19f44b4/mkbranch && chmod +x mkbranch
./mkbranch <issue番号>
```
`git`コマンドを使用しているので，プロジェクトディレクトリ下で実行してください。
シークレットレポジトリの場合は https://github.com/settings/tokens から`Full control of private repositories`なトークンを取得してGIT_HUB_API_TOKENに入れてください。
**トークンを入力したスクリプトをGitHubで公開してしまわないようご注意ください!**

シェルスクリプト初心者なので変なところがあったらご指摘ください。
React+Redux+typescript+firebaseで認証機能作るのが辛い①

# firebaseで認証機能を作りたかった
　firebaseって、簡単に認証機能を使えるようにできているので、npmで取ってきたらあとはすぐにできる。。。はずだった。探してみると、確かに公式でもAPIの呼び方はあるし、Qiitaや他のブログなどにも色々探せば出てきた。でも私が~~コピぺ~~活用しやすい形式での実装が見つけられなかったので四苦八苦した話。全部書くとアレなので、ステップに分けて投稿する第一弾。

# 目次
　・Reactとfirebaseで認証機能作る //①
　・ReactとReduxとfirebaseで認証機能作る //②
　・Routeで認証するかホーム画面へ遷移するかを分ける //③

# Reactとfirebaseで認証機能作る
参考：[10分でできるReact+FirebaseのGoogleAuth](https://qiita.com/HorieH/items/8b4b1c4807e1eb6fcb0a)
シンプルで動くまでの最短を行くことができました。ただし、私はtypescript派なので、少しもじりました。
１からの手順は上記の記事を参考にしてください。上記と違うのは、```create-react-app```にtypescriptオプションをつけたことくらいです。（地味にjsからtsの変換も慣れないうち私は苦労したのでコード載せておきます。
いじったファイルは次の通り

```typescript:firebase.ts
import * as firebase from 'firebase/app';
import 'firebase/auth'

const config = {
    apiKey: process.env.REACT_APP_FIREBASE_APIKEY,
    authDomain: "xxxxx.firebaseapp.com",
    databaseURL: "https://xxxxx.firebaseio.com",
    messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,
    projectId: "xxxxx",
    storageBucket: "xxxxx.appspot.com"
};

firebase.initializeApp(config)

export default firebase
```

```typescript:App.tsx
import * as React from 'react'
import './App.css'
import firebase from './firebase'

interface UserStatus {
  user: firebase.User | null
}

class App extends React.Component {
  public state: UserStatus = {
    user: null
  }

  public componentDidMount() {
    firebase.auth().onAuthStateChanged(user => {
      this.setState({ user })
    })
  }

  public login() {
    const provider = new firebase.auth.GoogleAuthProvider()
    firebase.auth().signInWithRedirect(provider)
  }

  public logout() {
    firebase.auth().signOut()
  }

  public render() {
    return (
      <div className="App">
        <p className="App-intro">
          UID: {this.state.user && this.state.user.uid}
        </p>

        {this.state.user ? (
          <button onClick={this.logout}>Google Logout</button>
        ) : (
            <button onClick={this.login}>Google Login</button>
          )}
      </div>
    )
  }
}

export default App
```

stateは、本来使用するべきinterfaceに書き換えるべきでしたが、まずは実行出来るところまで行こうとしていたためご容赦ください。
で、実行すると、
・ログイン前
<img width="470" alt="スクリーンショット 2019-03-02 23.36.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/b72e692a-7efe-e80b-141b-2847e74a4acf.png">

・ログイン後
<img width="470" alt="スクリーンショット 2019-03-02 23.35.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/391aa1df-76ae-e680-49e2-08dd8928527d.png">

はい、簡単にログイン処理ができました。firebase側でログイン状態を持ってくれているのでcomponentDidMountの中でfirebaseのメソッド呼ぶだけでログイン状態の保持もできる。なんてシンプルなんだ！

そしたらまあ、ログインしているならホームの画面に行く。それ以外の場合はログイン画面へリダイレクトする画面フローにしたくなるわけです。

ただ、Reactとfirebaseだけで構成してあるため、画面が複数になったりすると、この構成だとなかなか厳しいものがある。じゃあやっぱりRedux使った方がいいよねってことで、ちゃんとReduxに合った方法で実装していこうと言うことにした。

。。。正直参考にしたコード少し弄ればすぐだとなめていたのだが、思った以上に苦労したので、次回まとめます。

ひとまず認証の動作確認まででこの記事は終わり。

次→https://qiita.com/teshima/items/2191a9751a4ab16e7ec2
Reactで、なまら強引にHTMLを表示させる

## usage
ユーザーからお堅い文章（利用規約とか）が、HTMLファイルで渡される。
typoとか、知らねーし。

### ファイル読み込んで突っ込めば良いんじゃね？

```App.htm
<div class="hard">
    <h1 class="hard__title">お堅いタイトル</h1>
    <p class="hard__context">お堅い内容</p>
</div>
<style>
    .hard__title { color: red; }
    .hard__context { font-weight: 700; }
</style>
```

```App.js
import React, { Component } from 'react';
import file from './App.htm';

class App extends Component {
  componentDidMount() {
    fetch(file)
      .then( res => res.text() )
      .then( text => document.querySelector('#inner').innerHTML = text );
  }

  render() {
    return (
      <div id="inner"></div>
    )
  }
}
export default App;
```

### htmlファイルだと、なんか怒られた
create-react-appだと、なんか怒られたのでhtmに拡張子を変更。
ダブルクリックで、ブラウザ立ち上がるから良いよね。
[Pytorch] gradCAM, guidedBackProp, smoothGradの実装

gradCAM, guidedBackProp, smoothGradを実装してみました
ソースコードは以下にあります
https://github.com/kamata1729/visualize-pytorch

# 実行結果
||ostrich.jpg|elephant.jpg|
|---|---|---|
|raw|<img src="https://i.imgur.com/7bXQsgJ.jpg" width="300">|<img src="https://i.imgur.com/K8uSY69.jpg" width="300">|
|gradCAM|<img src="https://i.imgur.com/DP8O67J.png" width=300>|<img src="https://i.imgur.com/s5scZJV.png" width=300>|
|guidedBackProp|<img src="https://i.imgur.com/zwAlC7D.png" width=300>|<img src="https://i.imgur.com/Am1Pp0q.png" width=300>|
|guidedGradCAM|<img src="https://i.imgur.com/4GQa0Lw.png" width=300>|<img src="https://i.imgur.com/xwRqYNm.png" width=300>|
|smoothGrad|<img src="https://i.imgur.com/PqnI1mL.png" width=300>|<img src="https://i.imgur.com/hzAtgpM.png" width=300>|
Seeeduino（Arduino互換ボード）でモーターを制御する

#Seeeduino の初期設定と動作確認

初期設定とLチカはこちら
[Seeed Studio の Seeeduino（Arduino互換ボード）でLチカする](https://qiita.com/diskn/items/6c7b73c40a0eb6a0a437)

ボードの指定とCOMポートが認識されているか確認しましょう。

#Grove - Mini I2C Motor Driver

今回使用するモータードライバーはこちら。
デフォルトの最大駆動電流は200mAです。

Grove - Mini I2C Motor Driver
http://wiki.seeedstudio.com/Grove-Mini_I2C_Motor_Driver_v1.0/

#モーターとの接続

JST-PH（2mmピッチ）のコネクタを使用してモーターと接続します。

JST製PHコネクタ2ピン付きワイヤ（赤黒）
https://www.switch-science.com/catalog/2215/

#モーター制御
1. Mini I2C Motor Driver用の[ライブラリ](https://www.arduinolibraries.info/libraries/spark-fun-mini-moto)をダウンロード

1. [スケッチ] - [ライブラリをインクルード] - [.ZIP形式のライブラリをインストール] を選択し、ダウンロードしたライブラリをインストール

1. [スケッチ] - [ライブラリをインクルード] - [SparkFun MiniMoto]を選択

1. Seeed Studio Wiki のサンプルコードをコピペしてボードへ書き込むとモータが動作します。
clojureで環境変数を扱う

# はじめに

clojureで環境変数を扱う方法を調べたので記事にしました。

# environをインストール

https://github.com/weavejester/environ

environで環境変数を取得するので依存関係に追加します。

```project.clj
:dependencies [[environ "1.1.0"]]
```

# 使い方

environから環境変数のmapを取得します。
なおkeyは自動的にケバブケースに変換されています。

```clj
(require '[environ.core :refer [env]])

;; 環境変数DB_URLの値を取得
(env :db-url)
```

# その他

今回は環境変数のみを対象にしましたが、environはprofilesを扱えます。その場合は、lein-environも併用することになります。
決定木(CART)で分類、回帰をざっくりと

決定木(CART)の分類、回帰をしてみたメモ。


#決定木
理論などは[[入門]初心者の初心者による初心者のための決定木分析](https://qiita.com/3000manJPY/items/ef7495960f472ec14377)が参考になりました。

#実装
今回は、線形分離不可能であるmake_moonsを使用していきます。

##分類問題

```py
#必要なライブラリをインポート
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

#データの数は200、ノイズ(分散)は0.1に設定
moons = make_moons(n_samples=200, noise=0.1, random_state=0)

#データを分割する
X = moons[0]
y = moons[1]

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

#学習（treeの深さをデフォルトと３に分けている）
tree_clf = DecisionTreeClassifier().fit(X_train, y_train)
tree_clf_3 = DecisionTreeClassifier(max_depth=3).fit(X_train, y_train)

#結果
print(tree_clf.score(X_test, y_test)) #0.98
print(tree_clf_3.score(X_test, y_test)) #0.92
```

結果を見るとどちらも高精度で分類されていることがわかりますが、グラフにプロットしてみると

![スクリーンショット 2019-03-02 23.53.46.png](https://qiita-image-store.s3.amazonaws.com/0/346585/a15ae443-226a-975f-7620-63c879f8a8bc.png)
※左：デフォルト　右：treeの深さが３

右のtreeの深さが３を見るとうまく分類されていなく、また予測面が直線で表現されていることがわかりました。

##回帰問題

```py
#必要なライブラリをインポート
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
import mglearn
from sklearn.tree import DecisionTreeRegressor

#データを分割、学習（treeの深さをデフォルトと３に分けている）
reg_X, reg_y = mglearn.datasets.make_wave(n_samples=100)

tree_reg = DecisionTreeRegressor().fit(reg_X, reg_y)
tree_reg_3 = DecisionTreeRegressor(max_depth=3).fit(reg_X, reg_y)

#結果
print(tree_reg.score(reg_X, reg_y)) #1.0
print(tree_reg_3.score(reg_X, reg_y)) #0.80
```
結果を見ると、デフォルトが100%と過学習？となってしまった。
グラフにプロットすると

![スクリーンショット 2019-03-03 0.03.04.png](https://qiita-image-store.s3.amazonaws.com/0/346585/c743582b-b8fb-66e4-08a1-335e37d7db13.png)
※左：デフォルト　右：treeの深さが３

分類問題の時と同様にtreeの深さが３ではうまく予測されていなく、予測面が直線となってしまっていることがわかりました。


**決定木のメリット**
・ホワイトボックスな為、理解が容易
・分類問題、回帰問題のどちらにも適用可能

**決定木のデメリット**
・過学習しやすい
・予測面が滑らかではない
aws-cli で S3ウェブサイトホスティングをする

# 前提
- S3 のwebサイトホスティングをcliでやってみようの巻。
- 今回は bucket-acl のみで bucket-policy は使ってません。
- CloudFrontは無しの構成です。

# 流れ
 1. バケット作成
 2. webサイト設定の有効化
 3. コンテンツを格納
 4. 公開

# 手順
## バケット作成

```bash
aws s3 mb s3://mybucket
```

## webサイト設定の有効化
以下のファイルを作成する（website.json）

```json:website.json（例）
{
	"IndexDocument": {
		"Suffix": "index.html"
	},
	"ErrorDocument": {
		"Key": "error.html"
	}
}
```
上で作ったファイルをオプションで指定してwebサイト用の設定を投入

```bash
aws s3api put-bucket-website --bucket mybucket --website-configuration file://website.json
```

## コンテンツ格納

```bash
aws s3 cp index.html s3://mybucket/index.html --acl public-read
```
- その他のファイルをアップロードする場合は、上のコマンドの index.html を置き換えてください。
- 注意
	- `aws s3api put-object`を使う場合は`Content-type`（text/html）や`Content-Length`オプションを設定して下さい。`aws s3 cp`であれば自動でいい感じに設定してくれますが、`aws s3api put-object`だと設定してくれないです。	    			


## 公開

```bash
aws s3api put-bucket-acl --bucket mybucket --acl public-read
```

## アクセス
`http://mybucket.s3-website-us-west-2.amazonaws.com/`

- APIのエンドポイントとURLが異なりますのでご注意ください
- リージョンはバケットを作成したリージョンに置き換えてください
GoogleAppsScriptでサーバー側からHTML側に値が上手く渡らない

## やりたかったこと
HTML側で```google.script.run```を使ってサーバー側の関数を呼び出し、その返り値を```withSuccessHandler(function)```のfunctionに引数として渡したいと思ったが、上手く渡らない。

## できたこと
渡したいと思っていたデータは、配列の中に連想配列を入れたもの。これをそのまま渡そうとするとできないが、```Array[0].key```という具合に一番奥まで覗いてから渡すと無事に渡せる。

## 調べてみた　その１
詳しいことはわからないが、検索してみると以下のページが引っかかった。
http://d.hatena.ne.jp/shima111/20140407/p1

別にkeyが数値だった訳ではないのだけれど、このページがお勧めする通りにJSON化してみたら普通に渡せるようになった。

## 調べてみた　その２
ここでHTML側に渡せる値をちゃんと調べてみた。 https://developers.google.com/apps-script/guides/html/communication#parameters_and_return_values にあるところをまとめる。

### 渡せるもの

- 数値
- 真偽値
- 文字列
- null
- プリミティブやオブジェクト、配列から構成されるJavaScriptオブジェクトおよび配列

### 渡せないもの

- 日付型
- 関数
- form以外のDOM要素
- 禁止された型を含むオブジェクトや配列
- 循環参照をしているオブジェクト

ここまで調べてようやく気づいたけど、渡したかった配列には日付型が入った連想配列が入ってたな。

という訳で、渡せないものを渡したいときはJSONで文字列化してから渡すのがいいみたいです。
絶対値を取った確率密度関数の平均と分散

### はじめに
@toku_sanと申します。初投稿なので、文章の拙さはご容赦ください。
### 前提知識：正規分布って何？
正規分布(ガウス分布)とは、
横軸に確率変数$X$、縦軸に確率密度を取った、
![正規分布.png](https://qiita-image-store.s3.amazonaws.com/0/370312/9da96dab-1e4f-637b-a07a-ba1fa8964928.png)
↑こんな感じのグラフ(今回は平均$=0$、分散$=1$です)。
数式だと、$X$に関する確率密度関数$F(X)$として
##
```math
F(X)=\frac{1}{\sqrt{2\pi \sigma_x^2}}\exp{\left\{-\frac{(X-\mu_x)^2}{2\sigma_x^2}\right\}}
```
になります。
※平均は$\mu_x$、分散は$\sigma_x^2$。
前提知識はここまで。
もっと詳しく知りたい人は、ググって下さい。
### 確率変数の絶対値を取った時、平均と分散がどうなるか？
試しに、先のグラフにおいて$X$の絶対値を取ったグラフを描画して、
絶対値を取る前と比較してみる
(スペースの都合上、図の縦の縮尺が変わってます)。![正規分布_絶対値.png](https://qiita-image-store.s3.amazonaws.com/0/370312/10c59f85-6b03-a3a5-bb34-40152b1af5be.png)
分布のイメージはつかめたが、平均と分散に関しては、分からない。
そこで、まず$X$の絶対値を取った平均値$\mu_{|x|}$を定義通り表す。
#
```math
\mu_{|x|}=\int_{-\infty}^{\infty}|X|F(X)dX=\int_{-\infty}^{\infty}|X|\frac{1}{\sqrt{2\pi\sigma_x^2}}{\rm exp}\left(-\frac{\left(X-\mu_x\right)^2}{2\sigma_x^2}\right)dX
```
そして、ゴリゴリ計算すると...
#
```math
\mu_{|x|}=\sqrt{\frac{2\sigma_x^2}{\pi}}{\rm
  exp}\left(-\frac{\mu_x^2}{2\sigma_x^2}\right)+\mu_x\left(1-{\rm
  erfc}\left(\sqrt{\frac{\mu_x^2}{2\sigma_x^2}}\right)\right)
```
となる。(ここまで来たらC言語でもラクラク計算できる)
途中計算は長いので"ここでは"省略する。
ちなみに分散$\sigma_{|x|}^2$は、定義通り
#
```math
\sigma_{|x|}^2=\int_{-\infty}^{\infty}(|X|-\mu_{|x|})^2F(X)dX
```
をこれまたゴリゴリ計算して、
#
```math
\sigma_{|x|}^2=\sigma_x^2+\mu_x^2-\mu_{|x|}^2
```
となる。
研究や学会でどうしても各絶対値を求める途中式が知りたい方は、
[絶対値を取った確率密度関数の平均と分散(式変形編)](https://qiita.com/toku_san/items/22bdce9b9efb92798c97)を参照して下さい。

### 結論
絶対値を取った確率密度関数の平均と分散は定義に戻って、
"ゴリゴリ"計算すれば導出できる。
MAMP(Windows)のMySQLに接続する

# MAMP(Windows)のMySQLに接続する

<pre>
$dsn = 'mysql:dbname=mysql;host=localhost;charset=utf8;port=3306';
$user = 'root';
$pass = 'root';
$pdo = new PDO($dsn, $user, $pass);
</pre>

ちなみにMAMPのサーバー起動中に下記にアクセスするとphpMyAdminも確認できた
http://127.0.0.1/phpMyAdmin/
軽量版Kubernetesがリリースされたので使ってみた。（が動かない。）

その名もk3s.

早速使ってみました。
公式サイトは[こちら](https://k3s.io/)。

# 手順
公式サイトにある通りのコマンド実行を行います。

```
[root@localhost k3s]#  curl -sfL https://get.k3s.io | sh -
[INFO]  Finding latest release
[INFO]  Using v0.1.0 as release
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  Downloading https://github.com/rancher/k3s/releases/download/v0.1.0/sha256sum-arm64.txt
[INFO]  Downloading https://github.com/rancher/k3s/releases/download/v0.1.0/k3s-arm64
[INFO]  Verifying download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  systemd: Creating /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink from /etc/systemd/system/multi-user.target.wants/k3s.service to /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s
[root@localhost k3s]# which k3s
/usr/local/bin/k3s
```

k3sというコマンドがインストールされました。
どうも、k3sがkuberctlへのproxyコマンドになっている印象。

```
[root@localhost k3s]# k3s server &
・
・ （省略）
・
INFO[2019-03-02T14:06:54.483610551Z] Handling backend connection request [localhost]
WARN[2019-03-02T14:06:54.494138816Z] Disabling CPU quotas due to missing cpu.cfs_period_us
INFO[2019-03-02T14:06:54.494763746Z] Running kubelet --healthz-bind-address 127.0.0.1 --read-only-port 0 --allow-privileged=true --cluster-domain cluster.local --kubeconfig /var/lib/rancher/k3s/agent/kubeconfig.yaml --eviction-hard imagefs.available<5%,nodefs.available<5% --eviction-minimum-reclaim imagefs.available=10%,nodefs.available=10% --fail-swap-on=false --cgroup-driver cgroupfs --root-dir /var/lib/rancher/k3s/agent/kubelet --cert-dir /var/lib/rancher/k3s/agent/kubelet/pki --seccomp-profile-root /var/lib/rancher/k3s/agent/kubelet/seccomp --cni-conf-dir /var/lib/rancher/k3s/agent/etc/cni/net.d --cni-bin-dir /var/lib/rancher/k3s/data/d13d901c2b0aca5ab82da684ade2d343ea11285cf335afd743a7fc0a91583d56/bin --cluster-dns 10.43.0.10 --container-runtime remote --container-runtime-endpoint unix:///run/k3s/containerd/containerd.sock --address 127.0.0.1 --anonymous-auth=false --client-ca-file /var/lib/rancher/k3s/agent/client-ca.pem --hostname-override localhost --cpu-cfs-quota=false
Flag --allow-privileged has been deprecated, will be removed in a future version
FATA[2019-03-02T14:06:56.793982959Z] fannel exited: operation not supported
```
あれ？起動しない。
ので、Githubに[バグレポート](https://github.com/rancher/k3s/issues/115)した。
C の共用体メンバーに cgo  からアクセスする方法の一例

#環境
- go: 1.8.1 linux/amd64

昔書いたメモの公開なので公開日より環境がかなり古くなりますがご了承ください.

#問題の概要
go の仕様上の制限(?)で cgo で C の共用体の各フィールドにフィールド名を用いてアクセスすることができない.

例えば下記のような共用体 “myunion1” を例にする.

```c
typedef union myunion1 {
    int  iv;
    long lv;
} myunion1;
```

cgo で myunion1 内の iv に C.int 型の値を代入する場合, 例えば単純に下記のような方法ではコンパイルエラーとなる.

```go
var uni C.myunion1
uni.iv = C.int(100) // これは NG
```
コンパイルすると下記の様なエラーメッセージ.

```
$ go run cgouniontest.go
# command-line-arguments
./cgouniontest.go:51: uni.iv undefined (type C.myunion1 has no field or method iv)
```


# 解決策
共用体変数への C ポインタの変数を作ってポインタ変数の実体にアクセスするという方法を取れば問題を回避できる.

```go
    var uni C.myunion1
    p := (*C.int)(unsafe.Pointer(&uni))
    *p = C.int(2) // 値の代入
    fmt.Printf("uni.iv=%d\n", int(*p)) // 読み出し
```


# より実践的な例
構造体や enum と組み合わせたより実践的な例を載せておきます.
C.mystruct 型の変数 “str” の値を C から参照した場合 (C の関数 “printstruct()”) と cgo から参照した場合 (fmt.Printf() の行) で並べて表示しています.

```cgouniontest.go
package main

//#include <stdlib.h>
//#include <stdio.h>
//#include <string.h>
//
//typedef enum {
//    ev1,
//    ev2,
//    ev3,
//    ev4
//} myenum1;
//
//typedef enum {
//    eev1,
//    eev2,
//    eev3,
//    eev4
//} myenum2;
//
//typedef union myunion1 {
//    int  iv;
//    long lv;
//} myunion1;
//
//typedef union myunion2 {
//    myenum1 uv1;
//    myenum2 uv2;
//} myunion2;
//
//typedef struct mystruct {
//    myunion1 u1;
//    myunion2 u2;
//    int sv;
//} mystruct;
//
//void printstruct(mystruct str) {
//    printf("native c: iv=%d, lv=%ld, uv1=%d, uv2=%d, sv=%d\n", str.u1.iv, str.u1.lv, str.u2.uv1, str.u2.uv2, str.sv);
//}
//
import "C"

import (
    "unsafe"
    "fmt"
    "math"
)

func main() {
    var str C.mystruct
    p1i := (*C.int)(unsafe.Pointer(&str.u1))
    p1l := (*C.long)(unsafe.Pointer(&str.u1))
    p2  := (*C.int)(unsafe.Pointer(&str.u2))
    *p1i = C.int(100)
    *p2  = C.ev2
    str.sv = 3
    C.printstruct(str)
    fmt.Printf("cgo     : iv=%d, lv=%v, uv1=%d, uv2=%d, sv=%d\n", int(*p1i), uint64(*p1l), int(*p2), int(*p2), int(str.sv))
    *p1l = C.long(math.MaxInt32 * 4)
    *p2 =  C.eev3
    C.printstruct(str)
    fmt.Printf("cgo     : iv=%d, lv=%v, uv1=%d, uv2=%d, sv=%d\n", int(*p1i), uint64(*p1l), int(*p2), int(*p2), int(str.sv))
}
```

実行結果は下記の通り. C からも cgo からも同じ結果が得られた.

```
$ go run cgouniontest.go
native c: iv=100, lv=100, uv1=1, uv2=1, sv=3
cgo     : iv=100, lv=100, uv1=1, uv2=1, sv=3
native c: iv=-4, lv=8589934588, uv1=2, uv2=2, sv=3
cgo     : iv=-4, lv=8589934588, uv1=2, uv2=2, sv=3
```