OmniAICreator/Qiita-1.07M huggingface dataset:
함수선언식과 함수 표현식,화살표함수

```javascript:filename.js
    let name = 'john';
    alert(`hello,${name}`);
    alert(`the result is ${1+2}`);
    // 백틱안에서는 내부표현식을 사용할수 있다.

    alert( "the result is ${1 + 2}" ); // the result is ${1 + 2} 
    // 내부 표현식은 백틱에서만 사용할수 있다
```
```javascript:filename.js
// 콜백함수
function ask (question,yes,no) {
    if(confirm(question)){
        yes()
    } else {
        no()
    }
}

function showOk() {
    alert('You agreed')
}

function showCancel() {
    alert('You canceled the excution')
}

ask("Dou you agree?",showOk, showCancel);


// 함수포현식을 이용하여 코드양을 줄임

function ask (question, yes, no) {
    if(confirm(question)) yes();
    else no();
}

ask('Do you agree',
    function() {alert('You agreed')},
    function() {alert('You canceled the excution')}
);
```

## 함수선언식과 함수 표현식

```javascript:filename.js
// 함수선언식과 함수 표현식 Function Expression vs Function Declaration
// 함수선언식
function sum(a, b) {
    return a + b;
}
// 함수표현식
let sum = function() {
    return a + b
}

let age = prompt('what is your age', 18);
let welcome;

if(age < 18) {
    welcome = function() {
        alert('Hello');
    }
} else {
    welcome = function() {
        alert('Greetiong!');
    }
}

welcome();
-----------------------------------------------------------------
// 삼항연산자를 이용하여 표현
let age = prompt('What is your age?',18);
let welcome = age < 18 ? 
    function() {alert('hello')}:
    function() {alert('Greeting!')}

welcome();
-----------------------------------------------------------------
// 화살표 함수
let func = function(arg1, arg2, ...argN) {
    return expression;
}

let sum = (a, b) => a + b;

let double = n => n * 2;
alert(double(3)); // 6

let sayHi = () => alert('Hello');
sayHi();
-----------------------------------------------------------------
// 삼항연산자 + 화살표함수
let age = prompt("What your age?", 18);
welcome = age < 18 ?
    () => alert('Hello'):
    () => alert('Greetiong!');
welcome();
-----------------------------------------------------------------
// 여러줄 화살표함수
let sum = (a, b) => {
    let result =  a + b;
    return result;
}
alert(sum(3,3)); //6
```
## 화살표함수로 변환하기
```javascript:filename.js
// 문제
function ask(question, yes, no) {
  if (confirm(question)) yes()
  else no();
}

ask(
  "Do you agree?",
  function() { alert("You agreed."); },
  function() { alert("You canceled the execution."); }
);

// 화살표 함수로 변환

function agree(quesetion, yes, no) {
    if (confirm(question)) {
        yes();
    } else {
        no()
    }
}

ask('do you agree?',
    () => alert("You agreed."),
    () => alert("You canceled the execution.")
);
```
Kivyで非矩形ウィンドウ

kivyで非矩形ウィンドウを作る方法についての記事です。
ちなみにこの記事の内容は開成学園コンピューター部の文化祭にて僕が書いた部誌とほぼ同じ内容です。
pdfになってるのでそちらが良ければ[ここ](https://kclc.tk/dl/%E9%83%A8%E8%AA%8C.pdf)でダウンロードできます。
#画像の用意
まずはウィンドウの形を決める画像を用意します。ここで気を付けてほしいのは、「透過情報を持たせた画像を用意する」ということです。Windows10で標準搭載されているペイント3Dなんかを使えば結構簡単にできます。

僕はこんな感じの画像を用意しました。
![HEBIKUNN.png](https://qiita-image-store.s3.amazonaws.com/0/285911/858c1577-aba2-1027-c7f6-0117355c5092.png)

#プログラムを書く
プログラムを書いていきます。

```python
from kivy.config import Config
Config.set('graphics','shaped',1)
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window
from kivy.clock import Clock
import PIL


Window.fullscreen = False
Window.borderless = True
img_path = './HEBIKUNN.png'
img = PIL.Image.open(img_path)

class Test(App):
    def build(self):
        global img
        Window.size = img.size
        Clock.schedule_once(self.set)
        snake = BoxLayout()
        snake.add_widget(Button(text='1',on_press=lambda _: self.stop()))
        snake.add_widget(Button(text='2'))
        return snake
    def set(self,dt):
        global img_path
        Window.shape_image = img_path
        Window.shape_mode = 'binalpha'

Test().run()
```

とりあえず実行してみましょう。
![2018-10-24.png](https://qiita-image-store.s3.amazonaws.com/0/285911/e455cf17-7c80-db1d-5b47-ec678f32b342.png)
↑こんな感じになったら成功です。
ちゃんと非矩形ウィンドウになってますね。

手順としては
1. 透過情報をもった画像を用意する
2. buildメソッドでWindow.sizeを画像のサイズにする
3. shape_image,shape_modeをそれぞれ画像のパス、'binalpha'に設定する(非矩形ウィンドウにする為の設定です)
ということをするだけで簡単にできてしまいます。
#難点
たしかにこの方法だと簡単に非矩形ウィンドウが作れるのですが、一つ気を付けないといけないことがあります。
それは、「処理が無茶苦茶重い」ということです。当たり前ですが矩形ウィンドウに比べると凄く重いです。
ですから実用的にはちょっと厳しいと思います。でもまぁ結構面白いこと(ディスプレイ上キャラクターが動くゲームを作ったりとか)ができたりするので、ぜひ遊んでみてください。
react-nativeのIOSでテキストを部分選択する

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)
react-nativeはクリップボードの取り扱いが悪い。
例えば、iosでは全文選択の機能はあるが、部分選択の機能はない。

```jsx
<Text selectable>Foo<Text>
```
のように、Textをコピーペースト可能にする selectableプロパティはあるのだが...
以下のように全文コピーしか出来ない。
選択コピーが使いたい！！！
<img width="319" alt="スクリーンショット 2018-10-22 16.01.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/183835/97ff4ee3-db83-16a1-c0eb-94d44f636593.png">

そこで、TextInputを使う。
なぜなら、react nativeではTextは選択コピーに対応していないが、TextInputは選択コピーに対応しているのだ。

```
<TextInput
  style={styles.style}
  editable={false}
  multiline
  scrollEnabled={false}
  defaultValue={'コピー出来るぞ'}
/>
```
TextInputに、editable={false}(編集の禁止), multiline(改行を可能にする), を設定すると、Textのように扱える。
<img width="306" alt="スクリーンショット 2018-10-22 16.00.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/183835/ea917004-d853-be3d-f10a-fd56a44ac287.png">

ただし、注意点があり、textInputの高さが十分に与えられないと、スクロールしてしまう。
高さは余裕を持って設定しておこう。

どうしてもscrollが発生してしまう場合は、TextInputを囲むViewを取り除くと直ったり直らなかったりする。
scrollする原因がわからず、直せない箇所が一つあった。

## 結論
無理に範囲選択をreact nativeで実装するのはやめたほうがいいかもしれない。
どうしてもやりたかったら一応できるよ。

尚、androidでは、

```jsx
<Text>Foo<Text>
```
でも選択コピーが出来た。

またWebViewコンポーネントを使うことでも選択コピーが出来る。
コード内にhtml文書として書いたものをWebviewで

あと良かったら弊社のreact native製アプリのクリンタル、ダウンロードしてみてください。
公式のflutter pluginを修正する時のiosコードのフォーマットの仕方

公式のFlutter PluginのPull Requestの仕方は[公式](https://github.com/flutter/plugins/blob/master/CONTRIBUTING.md)を見ればわかります。

ただし、formatの仕方は以下のコマンドなのですが、これだと大抵の人はエラーでフォーマットされないと思います。

```
$ pub global run flutter_plugin_tools format --plugins <plugin_name>
```

なぜかというとflutterでのiosフォーマットで利用されているのは、clang-formatのバージョン5なのです。
homebrewでintallすると最新しかありませんので、バージョン5をインストールする必要があります。

# 解決方法

__以下のマージで最新のフォーマットになったようです。なのでこの記事通りしなくてもよくなりました。__
https://github.com/flutter/plugins/pull/905

バージョン5を取得します。

```
$ wget http://releases.llvm.org/5.0.1/clang+llvm-5.0.1-x86_64-apple-darwin.tar.xz
```

回答します。

```
$ xzcat clang+llvm-5.0.1-x86_64-apple-darwin.tar.xz | tar xfv -
```

名前を変えて、ソースを移動します。

```
$ sudo mv clang+llvm-5.0.1-final-x86_64-apple-darwin/ /usr/local/clang+llvm-5.0.1
```

シンボリックリンクを貼ります。

```
$ ln -s /usr/local/clang+llvm-5.0.1/bin/clang-format /usr/local/bin/clang-format5
```

上記にパスが通っていれば成功です。

```
$ clang-format5 -version
clang-format version 5.0.1 (tags/RELEASE_501/final)
```

その後、公式Pluginがあるルートディレクトリで利用するclang-formatを指定すれば良いです。

```
$ pub global run flutter_plugin_tools format --clang-format=clang-format5 --plugins <plugin_name>
```
Laravel5.5で突然の「View [home] not found.」を解決する方法

## ある日...

今関わっているプロジェクトで下記のようにmakeファイルを利用してコマンド実行を楽にしているのですが、

```
clear:
	composer dump-autoload
	php artisan down
	php artisan clear-compiled
	php artisan cache:clear
	php artisan config:clear
	php artisan config:cache
	php artisan route:clear
	php artisan view:clear
	php artisan up
```

`make clear`をホストOS上で叩いた途端`「View [home] not found.」`でシステム全体が動かなくなってしまいました。。。

## 原因は`php artisan clear-compiled`

上記コマンド一覧にある`clear-complied`コマンドによって`bootstrap/cache/config.php`内にViewファイルが保存されている場所を絶対パスで格納しているようでした。実際にプロジェクトのコードが稼働しているのはローカルで動いているDockerコンテナ上なので、ホストOSで取得された絶対パスのキャッシュをコンテナ上で見に行こうとしてエラーになってたわけなんですねー。

## 参考サイト

- [[Laravel]デプロイ時の最適化](https://qiita.com/qiita-kurara/items/d37dbc5b67e6b6dfbe1d#artisan-clear-compiled)
READMEを書こう

>**"READMEが無ければ、プログラムもまた存在し得なかっただろう"**
                              -- A.S --

##この記事の対象者・目的・意味
対象：README.mdを書かない、書いた事が無い人
結果：READMEが書けるようになるかも
時間：5分
※上記に当てはまらない人、普通に書く人は見るだけ無駄

##参考
[わかりやすいREADME.mdを書く](https://deeeet.com/writing/2014/07/31/readme/)
[わかりやすい README 駆動開発](https://qiita.com/b4b4r07/items/c80d53db9a0fd59086ec)

##最初に、README.mdを書くメリット
- ツールを作る上で必要な機能を確認できる(先に書く場合)。 
- 自分の作ったツールを再確認、再認識できる。
- 他者
- 使ってくれる人が増える、**充実したREADMEは信頼の証**

##何を書くか
最低限これを書いておけば良いと思う。

- **Name** : 名前
- **Description** : 説明。簡潔に何ができるかを伝える。
- status : ステータス、信頼度。
- **QuickStart** : 導入の手順。
- **Usage** : 使い方。クイックスタートとまとめても良き。
- Licence : ライセンス情報。
- Author : 作者。

その他、DEMOやFeatureなど、ものに応じて書き連ねる事がbetter。
ツールに持たせる名刺や説明書だと思ってる。

##まとめ
せっかく何か作るなら第一印象も良くした方がいいよね。 
というのがREADMEの役目。
まあREADME書くのにもデザインセンスいるよねー。
雑でもいいから書いてみよう！そのうちいい感じになるよきっと！
Qiitaに記事書くのも大変！だっる！！
Nuxt.js でビルド時間を100倍高速化して作業時間が大幅upした件（HardSourceWebpackPluginの紹介）

# 概要

現在、Nuxt.js(v1.4.1) で開発しているサイトが「お客様ヘルプ」系のサイトなので文字数が多く、また語録やQAが増える毎にファイルが増える画面構成で、プログラムのビルド時間がどんどん長くなって来ました。1文字変えただけでコマンド "nuxt build" でjs,cssファイルを毎回ミニファイしてても仕方ないので、基本は"nuxt"で開発環境確認をしていたわけなのですが、、、ある日、お客様QAを大量に増やしたことがきっかけでビルド時間が激遅くなり、ビルド待ち、作業は止まり、メンバーは沈黙、過ぎる何も生まない時間、やがて不機嫌、なんとかならない？、イライラ、不平、不満、そして最終戦争勃発と。。。

な、なんとかせねばッ！！

と、言う事でその問題を解決するWebpackプラグインを見つけたので紹介します。

参考にさせて頂いたサイトは以下になりNuxt.js用に書き起こした感じです。
[webpackのビルドを10倍高速化するプラグインの紹介](https://qiita.com/kmdsbng/items/d23f9b5f5fbc8869baad)
[[Nuxt.js] hard-source-webpack-plugin導入時のエラー対処法](https://b.0218.jp/20180404002932.html)

結果から言うと npm run dev(HOST=0.0.0.0 nuxt) をした時にビルド時間が桁違いに高速化しました。
**hard-source 導入前**

```shell
npm run dev
  nuxt:build App root: /home/dev/webapp +0ms
  nuxt:build Generating /home/dev/webapp/.nuxt files... +2ms
  ・
  ・
DONE  Compiled successfully in 231561ms
```
**hard-source 導入後**

```shell
npm run dev
  nuxt:build App root: /home/dev/webapp +0ms
  nuxt:build Generating /home/dev/webapp/.nuxt files... +2ms
   ・
   ・
DONE  Compiled successfully in -9199ms
```
 

マイナス -9199ms って…ｗ 爆速過ぎるやろ！まぁ導入前の231561msもヤバイですが。


[HardSourceWebpackPlugin](https://github.com/mzgoddard/hard-source-webpack-plugin)

HardSourcePlugin は追加すると node_modules/.cache/hard-source/ と言うフォルダを作り、そこに中間キャッシュを作ることで次回以降はそちらを見にいく様になります。それでビルド時間短縮を実現している形です。

# 導入手順(Nuxt v1.4.1ベース)

* HardSourcePluginをインストール

```shell
npm install --save hard-source-webpack-plugin
```

* nuxt.config.js の buildに追記

```js
// nuxt.config.js
module.exports = {
  router: // ...
  head: // ...
  env: // ...
  build: {
    extend(config, ctx) {
      const HardSourceWebpackPlugin = require('hard-source-webpack-plugin')
      config.plugins.push(new HardSourceWebpackPlugin())
    },
  }
}
```
これだけ

# 実行してみる

npm run dev や npm run build を普段通り実行すればOKです。
1回目の実行ではキャッシュを作るために普段と同じくらい時間がかかりますのでご注意を。
その際にnode_modules/.cache/hard-source/にハッシュ化されたキャッシュフォルダを生成します。
npm run dev 中に以下の様な文字がでてくればキャッシュ化されています。

```shell
[hardsource:12b44871] Using 19 MB of disk space.
[hardsource:12b44871] Tracking node dependencies with: package-lock.json, yarn.lock.
[hardsource:12b44871] Reading from cache 12b44871...
```
2回目の実行からは劇的に速くなるはずです。

ビルド時間が長くなって困っている方はぜひぜひお試しあれ。


# キャッシュでエラーになった場合にキャッシュを消す方法 

たまにキャッシュが上手く参照されずエラーが起こってしまう事があります。そういうときは一度キャッシュを削除して下さい。


```shell
rm -rf node_modules/.cache/hard-source/
```
GASのトリガーの起動失敗の通知をスクリプトで記述できないのか？

GASにおいて、よくある設置時刻を何時何分単位で細かく設定するスクリプト(*1)を援用し、
ScriptApp.newTrigger()による新しくトリガー設置スクリプトを記述していて、
「現在のプロジェクトのトリガー」一覧で正しく設置されていることは確認できたのだが、
そのときに「起動失敗の通知」の設定は、設置後のトリガー一覧からでしか設定できない...。

そこで、最初にスクリプトを記述する時点で”起動失敗の通知”の設定（immediate, every hour,...)ができないものだろうか？

*1は、こんな感じ。
function setTrigger(){ 
    var setTime = new Date();
    setTime.setHours(08);
    setTime.setMinutes(00); 
　　      ScriptApp.newTrigger('main').timeBased().at(setTime).create();
  }

これに例えば、
ScriptApp.newTrigger('main').timeBased().at(setTime).create().alert(immediate);

とか、.alert(immediate)のようなコマンドがあるのか無いのか？お教えください。
どうぞよろしくお願い致します。
PHP7.1から配列を結合する配列演算子の配列結合演算子・プラス記号・加算記号。「+」がWarningになっていた

**誤報なのですが恥ずかしいのでこのままにしておきます。**

# きっかけ

[動的型付けと静的型付け - Qiita](https://qiita.com/toryuneko/items/c023031b61886cae2a99)

>なお、これをPHPですると
>
```php
function add( $a, $b )
{
    return $a + $b;
}
```
>
```
1. add( 1, 5 ); // 6
2. add( 1.5, 3.2 ); // 4.7
3. add( 3, 3.5 ); // 6.5
4. add( "1", "5" ); // 6
5. add( "hoge", "hoge" ); // error
6. add( [1, 3, 5], [6, 8, 9] ); // error
```
1,2,3は想定内です。4が「6」になるのは暗黙の型変換によるものでしょう。PHPの場合、文字列結合はドット演算子「.」になりますので、ここでは数値型へ強制変換されたのかと。5．6については、当然エラーとなってしまいます。

&nbsp;

>**5．6については、当然エラーとなってしまいます。**

**え、6がエラーになるなんて逆に想定外なんですけど。**
(5の非数値Stringがエラーになるのもほんのすこし引っかかりましたが、それはあまり良くないコードなので今回は配列に対する`+`がメインということで)

# 動作結果

ということで動かしました

https://3v4l.org/iJOLG

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/11eb6846-6d51-660a-5197-faa49952b97d.png)

はえー
Warningレベルですがエラーが出てますね。

# そもそも配列結合演算子とは何だったのか

配列に対する`+`はマニュアルにも乗っている配列演算子の一つで、結合を表します。

[PHP: 配列演算子 - Manual](http://php.net/manual/ja/language.operators.array.php)

>
| 例 | 名前 | 結果 |
|:-:|:-:|:-:|
| `$a` + `$b`  |  結合 |  `$a` および `$b` を結合する。 |

公式のこのページにはまだ変更のお知らせが無いですね…

実際に使う場合はよく`array_merge`と迷うあれでした。
違いは以下の早見表が役立ちます。

[配列結合演算子, array_merge, array_replace を徹底比較 - Qiita](https://qiita.com/mpyw/items/578e1a14879e679d2141)

動作が完璧に同じではないので、それぞれ使いどころがあったのかなと思います。

正直、表でみても理解度が低いので被リンクのコメントも参照しておきます

[配列の結合 - Qiita#comment-a0790a5ed95382aa74a5](https://qiita.com/runmaru/items/1d58e53dce62467c7843#comment-a0790a5ed95382aa74a5)

>配列に関しての操作のみまとめると
>
*    `+` 演算子は常に **連想配列** として **前優先** でキーをセットする
>*    `array_merge` 関数は **文字列キーは連想配列** として **後優先** でキーをセットし、 **整数キーは通常配列** として **末尾** に新しく要素を追加する

がわかりやすいでしょうか。

# 変更は通知されていた

7.1の変更点は軽く目を通していたつもりですが、見落としていました。

[PHP: その他の変更 - Manual](http://php.net/manual/ja/migration71.other-changes.php)

その他の変更は本当に流し見の流し見レベルだったと思うので実際に影響あったのが驚きですね。

[PHP7.1α1の新機能 - Qiita#warn-about-invalid-strings-in-arithmetic](https://qiita.com/rana_kualu/items/476385b674d27339f911#warn-about-invalid-strings-in-arithmetic)
では説明文的には配列も含まれますが、サンプルコードでは配列は記載されていませんね。(RFCですしリンク先の提案自体にarrayの影が見えないので誤訳・誤情報というわけではないと思います)


# 所感

正直、PHPのバグ、とまではいいませんけれど、なんだか非数値のStringに対する算術演算の警告に配列が巻き込まれた印象を受けます。

変更理由の文章やコードを見ても配列を考慮されていない雰囲気を受け取ってしまいます。

でも、7.3まで現状のままということは正しいんですよね。
配列結合演算子に対応する関数を新設して、配列結合演算子はdeprecatedでもよかったのかなと思いました。
社内イベントの出欠管理をMicrosoft Formsで管理してみたときの振り返り

#バックオフィス特命係（本職は情シス）の悩み。

定期的に社員が集まる会議・イベントを開催する際に、いつも課題になるのが「社員の出欠管理」です。
今まではメールで出欠に対して回答してもらっていたんですが、いかんせん社員が200名を超えてきて、メールを集計するのに限界をきたしてました。

そこで新たに集計しやすい方法としてOffice365の機能の1つである「Microsoft Forms」というアンケートツールを利用してみたので良かった点や苦労した点をシェアします。

#出欠管理の要件
1. 回答者情報：名前、メールアドレスなど社員が特定できる
2. いくつかの選択肢から選択させる（参加する、途中参加する、不参加）
3. 選択肢によって追加質問事項が変更（参加する→どのコースに参加？/不参加→不参加理由）
4. 変更管理できる：参加→不参加になった場合などの連絡管理

#実際に運用してみてのTips
##1.回答者情報
これはOffice365ユーザーであれば、Formsの機能として、自動的に回答者の情報・回答時間を取得できるので、わざわざ名前を記入させないで一覧作成が可能で楽になった
また、Excelに回答がどんどんレコードとしてたまるので、一覧化する手間も少ない。

##2.いくつかの選択肢から選択させる
アンケートの基本機能としてラジオボタンやチェックボックスでの回答が可能なので集計の手間は楽

##3.選択肢によって追加質問事項が変更
質問の回答に対して、次の質問をどこするのか分岐設定できるので、ある程度の柔軟性は可能。
ただし、1質問に対して遷移先が1つしか選択できないので、複雑なルートの設計はできない。

##4.変更管理できる
ここはFormsでは管理できないので、1回アンケート回答後の変更は個別にメールで受けていた。
ただ、どこを変更したかが管理しにくく、参加メンバーに対して席割などが決まった後に再度調整が入って大変だった

#まとめ
簡単な出欠管理であればFormsで管理は可能だが、変更が多く発生するような場合は他の仕組みを考えたほうが良いだろう。
誰かもっとよい社内イベントの出欠管理ツールのご紹介をお待ちしています。
AWS Glueのテーブルに「OpenCSVSerde」を設定してみた

# やりたいこと
athenaでs3においてあるcsvファイルを検索したい

## 二重引用符(")で囲まれていることによる問題
glueでクローラーかけて、athenaから検索すると思うんですが、
s3に配置してあるインプットデータの各項目が二重引用符(")で囲まれていると、数字項目が消えます。

### インプットデータ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/13ef8cf2-1f3b-6d0e-858e-7fecbd737f70.png)

### クローラー実行でできたテーブル
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/d3b7a5e1-4ff2-3fa2-4418-8dd8ab08355e.png)

### athena検索結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/4a5214ef-59f2-ba66-ba66-c8d7fa068dd8.png)

⇒数字項目である「operationType」が消えている + 二重引用符(")がそのまま表示されてしまう。

## 対策「OpenCSVSerde」を使ってみる
### 変更前
glue　=>　テーブル　=>　テーブルの編集
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/7e9c87b2-772d-ae7d-5ee5-a5d924127631.png)

### 変更後
serdeシリアル化ライブラリを以下に変更
org.apache.hadoop.hive.serde2.OpenCSVSerde
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/d35e2b56-8fd2-2412-27ec-b19db64cd0cc.png)

### athena検索結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172015/a21e3f9d-36ca-5739-16cb-39a7bd424280.png)

**⇒数字項目である「operationType」の値が表示された + 二重引用符(")は見えなくなった**

## 残る課題
OpenCSVSerde使うと、timestamp型を直でテーブル定義できない・・・
どなたか対策ご存知でしょうか。。。
　⇒自己解決：インプットデータが「UNIX 形式の TIMESTAMP」 であればOK
　　※参考　[wikipedia UNIX時間](https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93)

## 参考
[AWS公式　CSV を処理するための OpenCSVSerDe](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/csv.html)
[Apache Hive CSV Serde](https://cwiki.apache.org/confluence/display/Hive/CSV+Serde)

# SerDeの読み方は「サーディー」
Monaca バックエンド Push通知を利用する前に知っておくこと

#Monaca バックエンド Push通知を利用する前に知っておくこと
##Monaca とは
Monacaは、Cordovaを内包したHTML5ハイブリッドアプリ開発プラットフォームです。
iOS,Androidをほぼワンソースで開発することができます。
一昔前は、スマートフォンの能力が低くWebPageをアプリ化する用途が多かったが、近年はスマートフォンの能力が向上しているため対応機種を絞れば、ネイティブアプリと遜色無いことができます。
##Monaca バックエンド Push通知とは
有料プランを契約すると100,000/月(Proは、1,000/月)まで利用することができます。
[プラン一覧](https://ja.monaca.io/pricing.html)
[プッシュ通知](https://docs.monaca.io/ja/products_guide/push_notification/overview/)
##制限事項
Businessプラン以上を契約して、100,000/月で十分賄えるプロジェクトというのは、結構あるのではないでしょうか。
プラン内であれば、追加費用無しで利用できますので、魅力的です。
だが、ちょっと待ってほしい。Monacaのプッシュ通知には、数以外にも制限があるのです。
`サウンドは、Monaca では現在使用できません。` 
そう、機能にも制限があるのです。
恥ずかしながら私がそうだったのですが、プッシュ通知の機能は、どのサービスでも一緒とは限りません。
必要な機能がカバーされているか、良く資料を読み込むことをオススメします。
##サービス品質
アプリに求められる可用性は、千差万別だと思いますが、サービス停止がクリティカルな場合には、採用は慎重になった方が良いと思います。
私が経験した範囲での話なので、参考程度にして頂ければと思うのですが、1年未満のプロジェクトで、プッシュ通知絡みの障害を3度経験しました。
1件の障害は、バックエンド側の不具合で、修正までおよそ1周間ほどプッシュ通知サービスが停止しました。
残りの2件は、原因不明のまま翌日に自然復旧したため、Monacaの先のGoogle,Appleの問題の可能性もあるのですが、サポートからは原因不明として回答があるのは、どうかな？と思いました。
趣味のアプリなら良いのですが、エンドユーザーに説明の求められる開発には、ちょっと不向きかも知れません。
Python 値に優先順位をつけてキーをソートする方法

###第一要素で昇順にソート後、同じ値を持つキーを第二要素で降順にソート

```test.py

dct = {
	'apple': (1,20),
	'banana': (5,40),
	'melon': (3,60),
	'potato': (3,20),
	'carrot': (5,80)
	}


dct_sorted = sorted(dct.items(), key=lambda x: (x[1][0], -x[1][1]))

print(dct_sorted)

#結果

[('apple', (1, 20)), ('melon', (3, 60)), ('potato', (3, 20)), ('carrot', (5, 80)), ('banana', (5, 40))]


```
rails のautosaveについて

has_one のアソシエーション先を同時保存/更新するときはデフォルトだと保存はできますが、更新はできません。(保存のときも小リソースがバリデーションに引っかかると親だけ保存されてるという謎仕様があるっぽい)

`autosave: true` にしておくと、更新時でも保存できますし、バリデーションもしてくれます。
( `validates_associated` というものもありますが、autosaveのほうが優秀なのと(追記参照)、2014年くらいから更新されていないので、 `autosave` の方がいいと思います。)

* 追記
ソースコードのドキュメントによると、autosaveはトランザクション内で親と小リソースを保存するらしい

```
Saving of the parent, its associations, and the destruction of marked associations, all happen inside a transaction.
```

参考URL
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/autosave_association.rb
inifileに簡単にアクセスするライブラリを公開してみる

inifileは結構今でも使われているので、inifile生成用のライブラリとして自分で作ってよく使うものを公開してみます。

以下にサンプルプロジェクトを。
https://github.com/kumokumocc/WORK_/tree/master/InifileTest

他のプロジェクトでも、inifileフォルダ内をコピーすれば使えます。（ただし、フォームのみ）

サンプルは、チェックボックスとテキストボックスを1個ずつ用意した単純なフォームアプリケーションです。

![testform.png](https://qiita-image-store.s3.amazonaws.com/0/244460/87845478-ca6d-f9ce-0a0b-8b3ed75e81ab.png)

動作としては、

初回起動時：
チェックボックスにチェックが入る。
テキストボックスに"Default"が入る。

2回目以降：
前回起動時のチェックボックスの値、テキストボックスの値が入る。

コードサンプルは以下

```
using System.Windows.Forms;

namespace InifileTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            new inifile.Forms.Control("TestSection", "DefaultText","Default",this, textBox1, false);
            new inifile.Forms.CheckBox("TestSection", "DefaultCheckBox",true,this,checkBox1,false);  
        }
    }
}
```

基本的な使い方は、フォームのコンストラクタでnewするだけです。
・inifileがない場合は、デフォルトの値を起動時にテキストボックスやチェックボックスに入力。
・存在する場合はinifileから読み込んだ値をテキストボックスやチェックボックスに入力。
・フォームを閉じるとき、テキストボックスやチェックボックスの値を書き込み。（存在しない場合は自動生成）
動作としてはこれだけですが、使いやすいことこの上ないのでいつも使っています。

inifile.Forms.Controlの使い方
セクション、キーを第1、第2引数に入力し、第3引数がデフォルトの文字列、第4引数は自身の所属するフォーム。第5引数が対象のコントロール（今回はテキストボックス)、第6引数はReadOnlyかどうかを示します。trueならば読み込むだけで書き込みません。

注意事項ですが、第4引数のフォームに対してFormClosedイベントを追加してinifileに書き込んでいるので、FormClosedイベントが起こらないようなフォームの消し方をすると上手く保存しません。
（うまいやり方があったら教えてください）

inifile.Forms.CheckBoxの使い方
ほぼ同じ。第3引数がbool型になるだけです。

その他、コンボボックス等も用意していますが、基本的に同じ使い方です。

ではまた。
JUnitでprivateメソッドをテストする

# 手順

1. 実装クラスのインスタンスを作成する
2. privateメソッドのインスタンスを作成する
3. privateメソッドへのアクセスを許可する
4. インスタンス化したメソッドに実装クラスのインスタンスと、メソッドの引数を渡す

# サンプルコード

```java:TargetClass.java
private String privateMethod(String message) {
	return "Input: " + message;
}
```

```java:TargetClassTest.java
@Test
public void privateMethodTest() {

	// 1. 実装クラスのインスタンスを作成する
	TargetClass targetClass = new TargetClass();

	// 2. privateメソッドのインスタンスを作成する
	Method privateMethod = TargetClass.class.getDeclaredMethod("privateMethod", String.class);

	// 3. privateメソッドへのアクセスを許可する
	privateMethod.setAccessible(true);

	// 4. インスタンス化したメソッドに実装クラスのインスタンスと、メソッドの引数を渡す
	String actual = (String) privateMethod.invoke(targetClass, "Oh my god.");
	String expected = "Input: Oh my god.";

	// Assert
	assertEquals(expected, actual);
}

```
Ruby on Railsチュートリアルが捗るCloud9使い方まとめ ※随時更新予定

# 注意事項
この記事は筆者がRuby on Railsチュートリアルを進めていきながら、
作業効率アップのために調べたコマンドやショートカットキーなどを書いていきます。
そのため、随時更新予定となっております。


# AWS Cloud9
AWS Cloud9 は、ブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE) です。
https://aws.amazon.com/jp/cloud9/

## Terminalからの操作
Cloud9 CLI のインストール

```Bash:cloud9_terminal
$ npm install -g c9
```

ファイルを開く
`open`はあってもなくてもOK

```Bash:cloud9_terminal
$ c9 open README.md
$ c9 README.md
```

## Cloud9エディタのキーバインドまとめ
Ruby on Rails チュートリアルをAWSのサービスであるCloud9を使って進めていく上で、
作業効率を高めるためのキーバインドをまとめました。

※Windows環境でのKeyBindになるのでMacOSは適宜読み替えてください。

<table>
<tbody>
<tr>
<th>KeyBinding</th>
<th>Command 説明</th>
</tr>
<tr>
<td>Alt+S</td>
<td>EditorとTerminalの切り替え(フォーカス移動)</td>
</tr>
<tr>
<td>Alt+W</td>
<td>Tabを閉じる</td>
</tr>
<tr>
<td>Alt+Shift+W</td>
<td>Tabを全て閉じる</td>
</tr>
<tr>
<td>Alt+Ctrl+W</td>
<td>現在開いてるTab以外を閉じる</td>
</tr>
<tr>
<td>Ctrl+D</td>
<td>1行削除</td>
</tr>
<tr>
<td>Ctrl+Shift+D</td>
<td>行を複製</td>
</tr>
<tr>
<td>Alt+↑(KeyUp)</td>
<td>行を1個上に移動</td>
</tr>
<tr>
<td>Alt+↓(KeyDown)</td>
<td>行を1個下に移動</td>
</tr>
</table>


## 参考サイト
https://cloud9-sdk.readme.io/docs/the-cloud9-cli
https://docs.c9.io/docs/keybindings
https://qiita.com/shin1kt/items/03eed49c12104002a2c7
https://www.shortcutfoo.com/app/dojos/cloud9-win/cheatsheet
TeraTermでログとファイル名を自動で取得できるようにする


# ログ保存大事
本番機にログも取らずに手打ちでコマンド入れてたらぶち殺されるぞ(震え
とはいえ忘れることもあると思うのでずぼらな自分のためにホスト名（IPアドレス）と日時があらかじめ入れられていたら便利だと思うので設定方法をまとめる。
できたら変更前と変更後のコンフィグを取ってファイル比較ソフトウェアのwinmerge等で比較しておくとよい

# 01.設定＞その他の設定を開く
<img width="446" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/171011/6232f0e5-c9d1-c37c-66bd-124964f2571d.png">

#02.「ログ」タブを開く。
標準ログ出力ファイル名に下記を入れる。
%Y%m%d_%H%M%S_&h.log
「自動的にログ採取を開始する」にチェックを入れる

<img width="445" alt="02.png" src="https://qiita-image-store.s3.amazonaws.com/0/171011/254e6957-ec74-07ff-05ac-921894deb792.png">


#03.「コピーと貼り付け」タブを開く。
ついでに右クリックで貼り付けの設定を変えておく。これでコピーしたコマンドが暴発してしまうのを避けられる。

<img width="441" alt="03.png" src="https://qiita-image-store.s3.amazonaws.com/0/171011/e6908a9d-2e56-dc1a-d931-969e05cf0b99.png">


#04.設定の保存を行う
この動作をしなければ先ほどの設定はすべて無駄になるため必ずすること。
<img width="448" alt="04.png" src="https://qiita-image-store.s3.amazonaws.com/0/171011/f751ef52-ceb0-6b69-d892-b8830861b103.png">

以上。
ルールを守って楽しくハック！

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
参考: [Tera Termログ取得－自動でログの取得を開始する設定]
(http://www.j-oosk.com/teraterm/logging/114/)
Atomic Designの練習〜画面分割〜

Atomic Designという手法を知って、調べて、実務でも使えるんじゃないかと思った矢先に、仕事でフロントエンドを触る機会がなくなってしまいました。しかし、せっかく知ったので、個人的にvueを使ってAtomic Designの練習をしてみようと思います。

練習台として使うのは、vuexのexampleであるToDoリストです。
https://github.com/vuejs/vuex/tree/dev/examples/todomvc
今回はこれをAtomic Designの手法にしたがって、画面上で各パーツに分けていきます。

## ToDoリスト
こちらがToDoリストの画面です。
<img width="679" alt="original.png" src="https://qiita-image-store.s3.amazonaws.com/0/58695/c3063529-1575-9cc1-339d-0d2cdcaa4b77.png">

### Atomic Designのコンポーネント粒度
分割をする前に、簡単にAtomic Designにおけるコンポーネント粒度をおさらいします。

#####Atoms
Atomic Designのコンポーネント粒度における最小粒度。機能的にそれ以上分割できない。
またこれ単体ではその機能の意味はわからない。
（例えばボタン。押すという機能は持つが、その結果何が起こるかはわからない）

#####Molecules
複数のAtomsによって構成される。機能の意味がわかる。
（例えばテキストインプットと送信ボタンを組み合わせることによって、入力された値を送信ボタンをクリックすることでどこかに送るという意味を持つ）

#####Organisms
複数のAtoms、Molecules、Organismsによって構成される。独立したコンテンツとして成立する。

#####Templates
Atoms、Molecules、Organismsを配置してページの構造を表す。

#####Pages
Templatesにコンテンツ（実際の文章や画像）を流し入れたもの。実際にユーザが見る画面。

##ToDoリスト画面を分割する
では実際に画面を分割していきます。
まずはTemplates。これはページの構造そのものなので、以下になります。
<img width="679" alt="Templates.png" src="https://qiita-image-store.s3.amazonaws.com/0/58695/b65eca7f-7f97-2e13-f3d2-60e3fc7d495d.png">

次にOrganismsです。
<img width="679" alt="Organisms.png" src="https://qiita-image-store.s3.amazonaws.com/0/58695/72a1366a-6c69-657f-7620-c231fdf15ef5.png">
ToDoリスト自身はそれ自体で独立したコンテンツとして成立するのでOrganismsになります。（他の機能がなくてもこれだけでToDoリストとして成り立つ）
また、リストの一つ一つもそれだけで成り立つためOrganismsにしました。（他のリストの内容に依存しているようならOrganismsにはならないかもしれないが、ToDoはそれぞれ独立している）

次はMoleculesです。
<img width="679" alt="Molecules.png" src="https://qiita-image-store.s3.amazonaws.com/0/58695/3c0ea06f-3d9c-b9f9-020b-fef077e40963.png">
`All`、`Active`、`Completed`それぞれをクリックすることで、それぞれの状態のToDoが表示されます。
いわゆるフィルタ機能を提供しているので、Moleculesとして括っています。

最後にAtomsです。
<img width="679" alt="Atom.png" src="https://qiita-image-store.s3.amazonaws.com/0/58695/74ee118e-2175-4717-e6fe-b1279d931a53.png">
最小粒度のコンポーネントのため、このようになります。それぞれが、もうそれ以上分割できない単位のパーツです。

というわけで、ひとまず画面をAtomic Designでの各層に分けました。
次回は実際にこれらを実装していきたいと思います。
JiraとGitLabの連携してもっと便利に使おう！

#はじめに

<font color="Red">**JiraのTransitionIDの確認方法を更新しました(2019/4/10)追記**</font>

詳細は下記リンクに書いています。
https://docs.gitlab.com/ee/user/project/integrations/jira.html

#前提

- Jiraにアカウントがあること
- GitLabにアカウントがあること

# 連携方法

GitLabのプロジェクトから Settings > Integrations を選択し、Project services の一覧の Jira をクリックします。すると下記のような画面になるので Active にチェックをつけて入力項目を埋めて、Test Settings and save changes を押して保存すると連携が開始されます。

![gitlab_setting.jpg](https://qiita-image-store.s3.amazonaws.com/0/255998/623c8afa-4480-c03e-421d-600d37dfbe01.jpeg)

# 設定項目について

### JIRA API URL

Jira の URL そのままで問題なし。

### username / password

Atlassian のアカウントで問題なし。

### Transition ID(s)

Transition ID(s) は Jiraのプロジェクトによって異なるため、対象の課題から調査して設定する必要があります。

具体的にはAPIを叩きます。例えば、マージされたら完了するよう連携させたい場合、マージ状態のISSUEを指定しAPIを叩きます。

`https://yourcompany.atlassian.net/rest/api/2/issue/ISSUE-123/transitions`

すると下記のJSONファイルを取得できます。

```
{
  "expand": "transitions",
  "transitions": [
    {
      "id": "101",　// <- 該当の Transition ID
      "name": "マージ",
      "to": {
        "self": "https://showcase-tv.atlassian.net/rest/api/2/status/6",
        "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.",
        "iconUrl": "https://showcase-tv.atlassian.net/images/icons/statuses/closed.png",
        "name": "完了",
        "id": "6",
        "statusCategory": {
          "self": "https://showcase-tv.atlassian.net/rest/api/2/statuscategory/3",
          "id": 3,
          "key": "done",
          "colorName": "green",
          "name": "Done"
        }
      },
      "hasScreen": false,
      "isGlobal": false,
      "isInitial": false,
      "isConditional": false
    },
    {
      "id": "131",
      "name": "レビュー取り消し",
      "to": 
      (以下略)
    }
}
```

Transition情報は複数返ってきますが、今回はISSUEを完了させたいのでそれに該当する Transitions ID を見つけます。

# 使い方

GitLab で merge request を投げ、タイトルにトリガーとなる単語を含めます。すると Jira へのリンクが自動で貼られます。

![git_merge_request.jpg](https://qiita-image-store.s3.amazonaws.com/0/255998/e2b3187f-3239-64b6-b196-69bb0a973a88.jpeg)

トリガーとなる単語は３つで、下記のように記述します。

- Resolves {IssueID}
- Closes {IssueID}
- Fixes {IssueID}

Jira側にもリンクが貼られます。対象の課題を開くと、 Issue links にリンクが貼られます。

![スクリーンショット 2018-10-23 15.33.58.png](https://qiita-image-store.s3.amazonaws.com/0/255998/742cecb8-68d9-6532-4217-ec18396716b8.png)

この他、コメントにも追加されます。

![jira_comment.jpg](https://qiita-image-store.s3.amazonaws.com/0/255998/f9e9d587-c5b2-1c80-6de1-f3c676b78a0e.jpeg)


この merge request が閉じられるとワークフローの状態が自動で変更されます。（ワークフローの状態名はプロジェクトにより違いがあります）

![スクリーンショット 2018-10-23 17.02.40.png](https://qiita-image-store.s3.amazonaws.com/0/255998/4a3b2c1f-4377-7aae-580d-5d1f593c9ad8.png)
↓
![スクリーンショット 2018-10-23 17.02.52.png](https://qiita-image-store.s3.amazonaws.com/0/255998/40f232a4-ee5a-5f35-351c-3ff51c4ee308.png)

便利！

# まとめ
自分が設定した際に、少しわかりにくい箇所があったので記事にしました。最適化はQOLをあげるのでどんどんやっていきたいですね！
TypeScript で、入力に応じて特定の型を返す Overload Signature の使い方

# 題材

関数 `invert` があり、入出力の型が下記の通りとする

- 入力が `string` のとき -> `number` を返す
- 入力が `number` のとき -> `string` を返す

# Overload Signature 使わないでやる

このとき、下記のように書いても動作するが

```ts
export function invert(n: number | string): string | number {
  return typeof n === 'string' ? parseInt(n) : String(n)
}
```

この書き方の場合、関数を使う側で型のチェックが必要になる。理由は、 `invert()` は `string` もしくは `number` を返す型と認識されるため。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103885/efe54f5a-8449-b00b-5eda-d87200e8e7ac.png)

# Overload Signature を使うと

ここで Overload Signature の出番。
入力に応じて、どの型が返されるのかを指定することができる。

```ts
export function invert(n: string): number // <-- string の時は number を返す
export function invert(n: number): string // <-- number の時は string を返す
export function invert(n: number | string): string | number {
  return typeof n === 'string' ? parseInt(n) : String(n)
}
```

関数に注釈をつける感じ。

今度は、 `invert` 呼び出し側での型チェックが不要になった。また、誤った型指定をするとエラーにもなる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103885/5012674f-efbe-5755-7f30-b2d3ccfae98b.png)

# ついで

ちなみに、下記のように引数の数を変更することも可能。ちゃんと型推論してくれるTypeScriptすごい・・・

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103885/72c557da-4437-a32e-2a46-84f5f1df99c0.png)
Terraformを使ってdev環境でのみリソースを作成する

# はじめに
Terraformで複数環境を管理しているときに、CircleCIのAWS Permissionsに設定するためのIAMユーザーの作成もTerraform管理に含めたい！…　ということで、dev環境でのみリソースを作成する方法です。
Terraformのバージョンは0.11.9で検証しています。

# やり方

`count = "${terraform.workspace == "dev" ? "1" : "0"}"`
countは0のときは作成せず、１のときは一つ作成するという仕組みを利用します

```sh
terraform env new dev
terraform env select dev # これすることでterraform.workspaceがdevになります
```

- 以下は全体のコードです

```sh:deployer_iam_user.tf
esource "aws_iam_user" "user" {
  count = "${terraform.workspace == "dev" ? "1" : "0"}"
  name = "${var.name}-deployer"
}

data "aws_iam_policy_document" "deployer_policy_document" {
  statement {
    actions = [
      "s3:ListBucket"
    ]

    resources = [
      "arn:aws:s3:::${var.bucket}"
    ]

    condition {
      test     = "StringEquals"
      variable = "s3:prefix"

      values = [
        ""
      ]
    }
  }

  statement {
    actions = [
      "s3:ListBucket",
    ]

    resources = [
      "arn:aws:s3:::${var.bucket}",
    ]

    condition {
      test     = "StringLike"
      variable = "s3:prefix"

      values = [
        "dev",
        "dev/*",
        "stg",
        "stg/*",
        "pro",
        "pro/*"
      ]
    }
  }

  statement {
    actions = [
      "s3:*",
    ]

    resources = [
      "arn:aws:s3:::${var.bucket}/dev/*",
      "arn:aws:s3:::${var.bucket}/stg/*",
      "arn:aws:s3:::${var.bucket}/pro/*",
    ]
  }
}

resource "aws_iam_policy" "deployer_policy" {
  count = "${terraform.workspace == "dev" ? "1" : "0"}"
  name        = "${var.name}-deployer-policy"
  description = "${var.name} deployer policy"
  policy = "${data.aws_iam_policy_document.deployer_policy_document.json}"
}

resource "aws_iam_policy_attachment" "deployer-attach" {
  count = "${terraform.workspace == "dev" ? "1" : "0"}"
  name       = "${var.name}-deployer-attachment"
  users      = ["${aws_iam_user.user.id}"]
  policy_arn = "${aws_iam_policy.deployer_policy.arn}"
}

resource "aws_iam_access_key" "key" {
  count = "${terraform.workspace == "dev" ? "1" : "0"}"
  user = "${aws_iam_user.user.name}"
}
```

```sh:variables.tf
variable "name" {
  default = "sample"
}

variable "bucket" {
  default = "sample"
}
```

# 最後に
`terraform env select`で環境を選択するだけでお手軽にCircleCIデプロイ用のIAMユーザーを作成することができました。
こんな感じですべてのリソースをTerraformで管理したいですね！
string.getByte()とHex.decodeHex(string.toCharaArray())の違い

string.getByte()とHex.decodeHex(string.toCharaArray())はどちらもstring文字列をbyte[]型に変換する処理ですが、少し違いがあります。

string.getByte()
普通の文字列をbyte[]型に変換する。
変換後のbyte長はhexで変換した場合のbyte長の2倍になります。

Hex.decodeHex(string.toCharaArray())
16進数にダブルクォーテーションをつけた文字列（要するにString型だけど中身のデータは16進数である文字列）をbyte型に変換する。

では、変換する文字列が「1」や「a」のような16進数か普通の文字か一見区別がつかない文字列を両方の処理をするとどうなるのか。

結果としては、それぞれで異なるbyte[]型文字列が生成されます。
SATySFiで二項演算子や単項演算子を定義する

二項演算子つくるときはこう

```
let ( ここに演算子にしたい文字列を書く ) 引数1 引数2 = 結果
```

単項はこう

```
let ( ここに演算子にしたい文字列を書く ) 引数1 = 結果
```

二項演算子の場合、最初に使える文字は

- +
- -
- *
- /
- =
- <
- >
- &
- |
- ^

です。

単項演算子の場合

- !

だけです。

2文字目以降には

- +
- -
- *
- /
- ^
- &
- |
- !
- :
- =
- <
- >
- ~
- '
- .
- ?

が使えます。

## 例: リストの先頭に要素を追加する演算子`>>`を定義する

```
@require: stdja
@require: list

let ( >> ) x lst = x :: lst

let-inline \dump lst =
  let d = lst |> List.fold-left (fun acc n -> acc ^ (arabic n) ^ `;`) ` ` in
  embed-string (`[` ^ (string-sub d 0 ((string-length d) - 1)) ^ `]`)
in

document (|
  author = { Seiei MIYAGI };
  show-title = true;
  show-toc = false;
  title = { SATySFiで演算子定義 }
|) '<
  +p {
    \dump(1 >> 2 >> 3 >> []);
  }
>
```

### 結果

![Screenshot from 2018-10-24 06-58-04.png](https://qiita-image-store.s3.amazonaws.com/0/2074/516a5de4-f788-b152-ba01-ed4867f6e4a7.png)


## 例: ネコにしゃべらせる単項演算子`!>^..^<`を定義するにゃん

```
@require: stdja

let ( !>^..^< ) s = {\>^..^\< .o( #s;にゃん )}
let message = !>^..^< { ねむ }
in

document (|
  author = { Seiei MIYAGI };
  show-title = true;
  show-toc = false;
  title = { SATySFiで演算子定義 }
|) '<
  +p { #message; }
>
```

### 結果

![Screenshot from 2018-10-24 07-10-16.png](https://qiita-image-store.s3.amazonaws.com/0/2074/81d4c290-a029-6d3b-f4ed-3732919969f3.png)
AsyncStorageを使ってみる


ReactNativeでは簡単なデータならDBとか使わなくてもAsyncStorageを利用して保存できます。特に悩むことはありません。

基本的には、

* 設定：AsyncStorage.setItem('key','value');
* 取得：AsyncStorage.getItem('key');

とするだけ。

[本家サイト](https://facebook.github.io/react-native/docs/asyncstorage.html)を参考に下記のように記述してみました。

名前(name)を受け取り保存。nameをAlertで出力。

```js:App.js
import React from 'react';
import { StyleSheet, Text, View, Button, Alert } from 'react-native';
import { AsyncStorage } from "react-native"

export default class App extends React.Component {


  storeData = async (name) => {

    try{
      await AsyncStorage.setItem('name',name);
    }catch(error){
      console.log(error);
    }

    Alert.alert(name + ': stored');
  }

  getData = async () => {

    try{
      const value = await AsyncStorage.getItem('name');
      if(value !== null){
        Alert.alert('We have ' + value);
      }else{
        Alert.alert('We have no data');
      }
    }catch(error){
      console.log(error);
    }
    
  }

  render() {
    return (
      <View style={styles.container}>
        <Button
          title='保存'
          onPress={()=>this.storeData('Tanaka')}
        />
        <Button
          title='取得'
          onPress={()=>this.getData()}
        />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

```
pipのインストールで pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. と出る場合


#　問題
新しいmoduleをpipでインストールしようとしても
`pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. `とエラーが出てインストールできない。

# 解決策
```
brew unlink openssl 
brew reinstall openssl
```

# 参考
http://blog.hankcs.com/15218609863642.html
Android launchModeの違い

#まずスタックとタスク（activity）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/c9b463cc-8202-e7fa-c671-151cfa9b79f2.png)

#１standard
###常に新しいタスクを生成される
* 下記起動順
* startActivity(main)
* startActivity(sub)
* startActivity(main)
* startActivity(main)
* 結果:４つのタスクを作成される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/0e22b172-5e81-98dd-2653-fdb7792e184d.png)

※：この状態でバックキー押すと、mainを表示される

#２singleTop

###起動タスクとTOPタスクを同じなら、新たに作らない。
* 下記起動順
* startActivity(main)
* startActivity(sub)
* startActivity(main)
* startActivity(main)　※：ここは新たに作らない
* 結果:３つのタスクを作成される
* 
※：この状態でバックキー押すと、subを表示される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/a24d05b7-85b5-ea69-907f-06126c523298.png)

#３singleTask
###自分より上のタスクをクリアされる。

* 下記起動順
* startActivity(main)
* startActivity(sub)
* startActivity(main)　※：ここはsubのタスクをクリアされる
* startActivity(main)　※：ここは新たに作らない
* 結果:１つのタスクを作成される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/2baaab50-4456-c0dc-6413-f39a6e40ff1c.png)

※：この状態でバックキー押すと、アプリ終了する

#４singleInstance
###スタック内にmain一つしかない。

* 下記起動順
* startActivity(main)
* startActivity(sub)　※：ここは新たなスタックとタスクを生成して表示している
* startActivity(main)　
* startActivity(main)　
* 結果:２つのタスクを作成される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/26aee999-4f54-d128-e5ec-02f6dd11cb6e.png)

※：この状態でバックキー押すと、subを表示される
virtualenv コマンド一覧

```
virtualenv --system-site-packages -p python3 ./venv
# Activate the virtual environment using a shell-specific command:

source ./venv/bin/activate  # sh, bash, ksh, or zsh
# When virtualenv is active, your shell prompt is prefixed with (venv).

# Install packages within a virtual environment without affecting the host system setup. Start by upgrading pip:

pip install --upgrade pip

# pip list  # show packages installed within the virtual environment
And to exit virtualenv later:

deactivate  # don't exit until you're done using TensorFlow
```
エンジニア向けにいいこと言ってそうな名言を集めたサイトを作った【個人開発】

英語でよくある、いいこと言ってそうに見えるけどなんかプッとくる名言みたいなのが好きで集めていた。職場での息抜きにそういう一文をslackに貼り付けるのはよくやっていて、面白いからまとめてウェブサイトにした。

[**エンジニアの名言メーゲン**](https://www.meigen.ga/)
https://www.meigen.ga/


<img width="600" alt="Screen Shot 2018-10-23 at 20.57.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/aba91435-e70b-3146-d8e3-09d84e908c63.png">

バックグラウンドにきれいな景色の写真を入れて無駄に「いいこと言ってそう」な雰囲気にした。




名言は人気順ということでツイート数順に上から並べている。もし気に入ったのがあって、ツイッターで共有していただければ順位が上がりますよ、と。

<img width="600" alt="Screen Shot 2018-10-23 at 20.42.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/00549d38-8444-9aa5-1604-34cdcf6fb7c4.png">


無料だから.gaでドメインを取った。「名言. ガー」とでも覚えてください。
**https://www.meigen.ga/**

ボタンひとつで英語版に切り替わるので英語の勉強にもどうぞ。（学習効果の保証は一切無し）

<img width="600" alt="Screen Shot 2018-10-23 at 20.45.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/ee72f402-64e6-9539-06ad-b422d56d454e.png">



ほんとただの趣味でしかないんだけど、集めているのでもし面白いのをご存知でしたらサイトのフォームから入れてお知らせいただければ嬉しい。一応ご説明させていただくと、松下幸之助語録みたいな真面目にありがたい感じのザ・名言みたいなのは募集してなくて「いいこと言ってる風でプっとくる」ってのがポイントです。


## 使った技術
ほとんど以前に作った個人開発アプリの使い回しなので実装は一瞬で終わった。

- Ruby on Rails
- Netlify
- React + Redux
- GraphQL
- heroku


これ以上にこのウェブアプリに意味は無い。普段から「収益性を考えてないウェブアプリなんかやめてしまえー」とか言ってるわりにこのアプリに収益を得る戦略もなにもない。目的はただ、いいこと言ってそうなエンジニアの名言を集めたいだけ。

別にいいだろ、モヤモヤしている時にスッとさせるにはなんでもいいから手を動かして作って公開するんだよ。

ということで最後はリーナス・トーバルズさんの名言メーゲン。


<img width="600" alt="Screen Shot 2018-10-23 at 20.51.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/b9a38e92-e147-ed38-eb85-c055642a9f8e.png">
HealthKitの認証確認画面が出なくなった話

#HealthKitの認証確認画面が出なくなった話
iOS11では動いていたのにiOS12にしたらいきなり動かなくなって、詰みかけたのでメモしておきます。
##現象
iOS11でHealthKitで心拍数の読み出しを実装していたのですが、iOS12にアップデートした後にアプリを起動するとすぐ落ちる、または認証確認が出ないといった問題が起こりました。

##原因はHealthKitのinfo.plist
あくまで私の環境の場合ですので解決方法の一因程度に考えておいてください。

iOS11のとき info.plist の "Privacy - Health Share Usage Description" に適当な短い説明を付けていました。
iOS12ではこの説明文が短すぎると認証確認できないようです。
つまり info.plist の"Privacy - Health Share Usage Description"の説明に適当に長い説明 ( 例："healthhealthhealthhealthhealthhealthhealth" ) とでも入力すると、ちゃんと認証確認が表示されました。

##まとめ
iOS12では info.plistの "Privacy" の説明の文字数をある程度長くしないと認証確認画面が表示されない。
ユーザのためを考えたアップデートですね。
Swift：NSBezierPathのオブジェクトにパスファインダーを適用する

# はじめに
macOSでベジェ曲線のパスを描くといったら，NSBezierPathを使うわけですが，二つのパスの結合や切り抜きなどをしたパスを生成することは容易ではありません．Illustratorでいう所のパスファインダーの機能をNSBezierPathに付加するライブラリの翻訳を行ったので，紹介します．

# 元となったモノたち
- [VectorBoolean](https://bitbucket.org/andyfinnell/vectorboolean)
Andy Finnell氏作のOSX向けプロジェクト．
Objective-Cで書かれているが，一応最新のmacOSでも動く．

- [Swift-VectorBoolean](https://github.com/lrtitze/Swift-VectorBoolean)
Leslie Titze氏作のiOS向けライブラリ．Swiftで書かれている．

# 成果物
### [BooleanPath](https://github.com/kyome22/BooleanPath)
macOS向けにSwift４で翻訳を行いました．
GitHubのリポジトリのプロジェクト内にデモアプリとFrameworkが入っているので使ってみてください．
（Xcode10，Mojaveで動作確認済み）

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/67153/48aba104-8d8c-b447-4c60-69a5bc68da58.png)
taskを用いてマルチスレッドを実装する簡単なコード

taskによってマルチスレッドを実現すると何がすごいのか、簡単に説明します。

ソースは以下に入れてます。
https://github.com/kumokumocc/WORK_/tree/master/TaskTest

フォームアプリケーションを作ってボタンとテキストボックスを1個ずつツールボックスで追加しただけの簡単なアプリケーションです。

```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TaskTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";//文字列初期化
            //TestCycle();
            TestCycle2();
            textBox1.Text += "button1_Click end\r\n";
        }
        private void TestCycle()
        {
            for (int i = 0; i < 1000000000; i++)
            {
                ;//空ループ10億回
            }
            textBox1.Text += "Loop end\r\n";
        }
        async private void TestCycle2()
        {
            await Task.Run(() =>
            {
                for(int i=0;i<1000000000;i++)
                {
                    ;//空ループ10億回
                }
                //textBox1.Text += "Loop end\r\n";//コメントアウトを外すと例外発生 System.InvalidOperationException: '有効ではないスレッド間の操作:'
            });
            textBox1.Text += "Loop end\r\n";//元のスレッドで、空ループが終わった後に実行。（Invokeしなくても例外発生しない）
        }


    }
}
```

button1をクリックするとtextbox1に文字列が書き込まれるソフトです。
重い処理として10億回空ループを作ってます。

まず、TestCycleを呼び出す場合の処理です。
クリック後、5秒程度ウィンドウがフリーズし、"Loop end"→"button1_Click end"の順にテキストボックスに追加されます。
メインスレッドがリターンしないので、ウィンドウがフリーズします。

taskを使ってマルチスレッドを用いて書くと、TestCycle2の処理になります。
クリック後、すぐ"button1_Click end"がテキストボックスに追加され、5秒程度経過した後、"Loop end"が追加されます。

どう動いているかを軽く解説すると、TestCycle2のメソッドに入り、awaitまで進むと、新しいスレッドを起動し、一度リターンします。
リターンするので、"button1_Click end"がテキストボックスに追加されます。
その後、別スレッドがawaitの行(空ループ)の処理を終えた後に元のスレッドでその先の行を実行します。
ここでは、テキストボックスに"Loop end"を追加します。

ポイントは、Invokeを使っていないこと。
これがどれほど偉大かは、他の方法でマルチスレッドを実装するとわかります。
Django：第3の文字列

使い古された話題かもですがちょっと面白いと思ったのでメモ。

##Form.fieldの中にこんなのがいた。
**Form.field**から値を取り出してjsonにしようとしたら怒られた。

```bash
TypeError: Object of type '__proxy__' is not JSON serializable
```

なんでそんなことしてんのってのはともかく、この**\_\_proxy\_\_**とは何ぞって**field.\_\_dict\_\_**を回してみると、なんか居るね。

```python
In [44]: for k, v in f.fields.items():
    ...:     print(k, v)
    ...:     for kk, vv in v.__dict__.items():
    ...:         print(type(vv))
    ...:         if isinstance(vv, dict):
    ...:             for kkk, vvv in vv.items():
    ...:                 print(type(vvv))
    ...:
costomer_id <django.forms.fields.CharField object at 0x0000000005BAE860>
<class 'int'>
<class 'NoneType'>
<class 'bool'>
<class 'str'>
<class 'bool'>
<class 'str'>
<class 'NoneType'>
<class 'bool'>
<class 'str'>
<class 'bool'>
<class 'NoneType'>
<class 'bool'>
<class 'dict'>
<class 'django.utils.functional.lazy.<locals>.__proxy__'>
```
##第３のストリング
公式ドキュメントに載ってます。はい。
[Translated strings](https://docs.djangoproject.com/en/2.1/ref/unicode/#translated-strings)（翻訳された文字列）
>**Aside from strings and bytestrings, there’s a third type of string-like object you may encounter when using Django.** The framework’s internationalization features introduce the concept of a “lazy translation” – a string that has been marked as translated but whose actual translation result isn’t determined until the object is used in a string. This feature is useful in cases where the translation locale is unknown until the string is used, even though the string might have originally been created when the code was first imported.

実際に文字列が使用されるまで翻訳のロケールが不明なため、宙づりにされた文字列というわけ。
ちなみに、直ちに実行中のコードで値の評価を行いたい場合は**str()**を呼べばよい。
> Calling str() with the lazy translation as the argument will generate a string in the current locale.
秀丸ファイラーClassic カスタマイズ設定メモ

# 概要
今まで、As/R というファイラーを長らく愛用していたのですが、ファイルサーバーへのファイルアクセスに非常に重くなるようになり、代替となるソフトを探していたところ、秀丸ファイラーClassic にたどり着きました。

As/R
http://www.all.undo.jp/asr/

秀丸ファイラーClassic
https://hide.maruo.co.jp/software/hmfilerclassic/index.html

## 設定していきたいこと
As/R は、ショートカットが超便利だったので、なるべくこれを再現したい。
- 一括リネーム
- エディターを起動（As/R ショートカットE）
- リネーム（As/R ショートカットR）
- ファイル名のコピー（As/R ショートカットT）

# カスタマイズ設定方法

まず最初に`［ツール］－［オプション］`の左下の「上級者向け設定」のチェックをいれる。

## ファイル名の境目のグリッド線を表示
デフォルトだと背景が真っ白で見づらいので、グリッド線を入れる。

`［ツール］－［オプション］
［デザイン/操作］－［ファイル一覧1］－［グリッドライン］にチェックを入れ「横」を選択する`

## ファイル名の行間を開ける
デフォルトだと、行間が詰まっていて見づらいので、少し行間をあける。

`［ツール］－［オプション］
［デザイン/操作］－［ファイル一覧1］－［間隔］を４ドットに設定する`

## タブバーの表示
秀丸ファイラーClassic も、As/R と同様に、複数のフォルダーを開いておいてタブで切り替えることができるが、デフォルトではタブが表示されていない。

`［表示］－［タブバー］－［ON］を選択する`


## 背景のダブルクリックで１つ上のフォルダへ移動する

`［ツール］－［オプション］
［デザイン/操作］－［ファイル一覧3］－［背景のダブルクリックで1つ上のフォルダへ］にチェックを入れる`

# 再現できない機能
- 便利なリネームツール　As/Rのリネームツールは非常に便利だったが、秀丸ファイラーClassicに同等の機能はないようだ。ショートカットは、変わりに F2 を使う。（Windows標準と同じ）

# As/Rより便利な機能
- フォルダーの分割表示ができ、左右あるいは上下に違うフォルダーを開くことができる。これは便利！

---

以下、2022年追記

# ショートカット設定
## ファイルのパスをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24420/e30baf62-8734-9a7f-3945-8f466909f2a1.png)
前までは、拡張機能を入れなければだったが、最新では、標準機能にはいっていた。

## テキストエディタで開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24420/b8404689-9fc6-67bb-3ccc-8f90c99c045d.png)
これも、もうちょい複雑な設定をしていた気がするが、これだけで設定できた。

# 一括リネーム機能
記事執筆時は機能がないと書いていたが・・・
`［ファイル］－［名前の変更（複数）］`で一括置換などができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24420/559ab974-99c3-37c6-ebe2-054aa8e9659b.png)
LaravelでAPIサーバ作ってる時にsafariでCORSがうまくいかなかった

# 背景
Vue.jsでaxios使って外部ドメインのAPIを叩くように実装していて、
laravel（ver 5.7）でAPIサーバを作ってCORSの対応をしていました。
ChromeやFirefoxではうまくいっていたんですけど、safariではエラーが発生、、、

`Origin http://... is not allowed by Access-Control-Allow-Origin.`

#試したこと
CORSの対応としては下記を参考にしていました。
・[https://hiroslog.com/post/67]
・[http://kayakuguri.github.io/blog/2017/06/19/larave-cors/]

結果、safari（ver 9.1）のみCORSに必要なヘッダー情報が付与されず、、、

#対応
暫定として、.htaccessにヘッダー情報を書いて対応。

```.htaccess:.htaccess
<IfModule mod_headers.c>    
    Header set Access-Control-Allow-Origin "*"
    Header set Access-Control-Allow-Headers "*"
    Header set Access-Control-Allow-Headers "X-CSRF-TOKEN,Content-Type,Origin,Authorization,Accept,X-Requested-With"
</IfModule>
```
*は適宜変更が必要
[301] エンジニア的に転職をハックする

ガイドライン違反のような気がしたのでZennに記事を移行しました。
https://zenn.dev/15/articles/835d936332f59b96f335

> Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」です。プログラマーが興味を持つものではなく、プログラミングに関する記事を投稿しましょう。
numpyでarrayの要素内の最頻値を求める

整数値でできた1次元arrayの最頻値を求める際に少してこずってわかりにくかったのでメモ

```
array = [0,1,1,5]
count = np.bincount(array)  -> [1,2,0,0,0,1]
ans = np.argmax(count)  -> 1
```
np.bincountが上の例だと0が1個、1が2個、2~4が0個、5が1個なので上記のような結果を返してくれる。
要素が整数の場合にしか使えないのが難点か
terminatorの設定

コード書くときには
・見やすくて
・日本語が崩れなさそうな

設定が大事。

WindowsやMacでターミナルを使用した経験の自分が使いやすいかなーとおもったものです。
更に自分は目が悪いのでこの設定にしました。

![Screenshot from 2018-10-24 01-32-25.png](https://qiita-image-store.s3.amazonaws.com/0/213689/a948394f-9a52-dd03-6ef1-24e2b1d13df9.png)



# Monospace RegularのFontサイズ15！

![Screenshot from 2018-10-24 01-19-56.png](https://qiita-image-store.s3.amazonaws.com/0/213689/3841096e-d50b-0095-6612-4c7a2f44e0f5.png)
![Screenshot from 2018-10-24 01-20-27.png](https://qiita-image-store.s3.amazonaws.com/0/213689/d0949ff1-b7b5-7484-9292-b491f226d985.png)

# スクロールバッファを10000。

![Screenshot from 2018-10-24 01-22-23.png](https://qiita-image-store.s3.amazonaws.com/0/213689/5f530d91-d6fe-0119-0fe6-c462c73377e2.png)

# 貼り付けをCtrl+v、Window分割をCtrl+D、Shift+Ctrl+D

![Screenshot from 2018-10-24 01-23-33.png](https://qiita-image-store.s3.amazonaws.com/0/213689/a890388f-a4ec-6545-ebe9-f1a562688cfb.png)

Ctrl+vはWindowsのクセみたいなところが強いです。
MacだとCommand+vですね。

Ctrl+Dは標準ではterminatorウィンドウの終了みたいなものがついてますが、
MacではiTermっていうアプリをつかってたので、その名残です。

なお、CopyについてはCtrl+cにしてません。
プログラムの中断とかでつかいますし。。。


![Screenshot from 2018-10-24 01-28-34.png](https://qiita-image-store.s3.amazonaws.com/0/213689/6e2cc868-8563-8fee-7ebb-53a63e358ed2.png)

その代わり、`選択をコピー`にチェックを入れてます。
WindowsのTeratermのクセ。です。。。


ほんとアベコベな設定です。
参考にしてやってください・・・